版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章目标掌握类和对象理解封装会创立和使用对象1/39万物皆对象世界是由什么组成的?名胜人物品动物,植物……
分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地进行分类2/39身边的对象张浩李明收银员员工号—10001
姓名—李明部门—财务部操作:收款打印账单顾客姓名—张浩年龄—20体重—60kg操作:购置商品3/403/39对象的特征——属性属性——对象具有的各种特征每个对象的每个属性都拥有特定值例如:张浩和李明的年龄、姓名不一样
20岁
张浩属性
60kg顾客张浩4/39对象的特征——方法方法——对象执行的操作对象:用来描述客观事物的一个实体,由一组属性和方法构成打印账单方法刷卡收银员李明5/40收银5/39对象的属性和方法列出尼古拉斯·凯奇驾驶的这辆法拉利F360Spider的属性和方法列出小狗对象的属性和方法属性:品牌:法拉利型号:F360Spider
颜色:黄色价格:380万元方法:发动停止加速属性:颜色:白色方法:叫跑吃6/40提问6/39封装对象同时具有属性和方法两项特性对象的属性和方法通常被封装在一起,共同表达事物的特性,二者相辅相承,不能分割一辆汽车,有完好的零件和特定的颜色还应具备开动、刹车等方法行为7/39小结说一说教室里的对象描述他们的属性和方法颜色:黑色品牌:BENQ投影姓名:张三年龄:20学习类型:白炽灯开关变亮变暗材制:木质支撑物品提问8/408/39从对象抽象出“类”轿车抽取出以下对象的共同特征〔属性和方法〕问题顾客9/39类顾客类轿车类
…………类是模子,定义对象将会拥有的特征〔属性〕和行为〔方法〕类是对象的类型不同于int类型:具有方法各种口味的球状冰淇淋10/4010/39类和对象的关系类是抽象的概念,仅仅是模板比方说:“人”对象是一个你能够看得到、摸得着的具体实体小布什普京克林顿……“人”类特征(属性)年龄体重行为(方法)衣食住行11/39Java是面向对象的语言
所有Java程序都以类class为组织单元关键字class定义自定义的数据类型
publicclassHelloWorld{ publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!!!"); }}12/40类的根本框架12/39Java类模板类将现实世界中的概念模拟到计算机程序中publicclass类名{//定义属性局部属性1的类型属性1;属性2的类型属性2; …属性n的类型属性n;//定义方法局部方法1;方法2;…方法m;}语法13/39定义类定义一个类的步骤定义类名编写类的属性编写类的方法14/39publicclassSchool{
//定义属性
StringschoolName;
//学校名称
intclassNumber;
//教室数目
intlabNumber;
//机房数目
//定义方法
publicvoidshowSchool(){
System.out.println(schoolName +classNumber+labNumber);
}}15/39如何创立和使用对象使用对象的步骤创立对象类名对象名=new类名();引用对象成员:使用“.”进行以下操作引用类的属性:对象名.属性引用类的方法:对象名.方法名()SchoolmySchool=newSchool();myS=“西南交大";//给name属性赋值mySchool.showSchool(); //调用showCenter()方法语法语法16/39创立和使用对象例如
一个景区根据游人的年龄收取不同价格的门票。请编写游人类,根据年龄段决定能够购置的门票价格并输出问题分析游人类姓名年龄显示姓名及门票价格17/4017/39创立和使用对象例如18/3919/39创立和使用对象例如小结类和对象的关系?如何创立和使用对象?提问经验利用MyEclipse自动提示功能20/39面向对象〔OO〕的优点面向对象与人类的思维习惯一致提高了程序的可重用性信息隐藏,提高了程序的可维护性和安全性21/39总结对象是用来描述客观事物的一个实体类定义了对象将会拥有的特征〔属性〕和行为〔方法〕类是对象的类型,对象是类的实例使用类的步骤定义类使用关键字class创建类的对象使用关键字new使用类的属性和方法使用“.”操作符22/39本章目标会定义和使用类的方法理解变量作用域会添加JavaDoc注释23/38类的方法写出狮子对象的“跑”方法、“叫”方法电动玩具狮子属性:颜色:黄色行为:跑叫按此按钮,狮子开始叫按此按钮,狮子开始跑问题24/38类的方法例如AutoLion类代码实现publicclassAutoLion{Stringcolor="黄色";
public
void
run(){System.out.println("正在以0.1米/秒的速度向前奔跑");}
public
String
bark(){Stringsound="大声吼叫";
returnsound;}}方法体返回值类型方法名称示例25/38如何定义类的方法类的方法定义类的某种行为〔或功能〕定义类的方法public
返回值类型方法名(){
//这里编写方法的主体}步骤一:定义方法名以及返回值类型步骤二:编写方法体语法方法的定义方法的名称方法的主体方法返回值的数据类型26/38方法的返回值两种情况如果方法具有返回值,方法中必须使用关键字return返回该值,返回值类型为该返回值的类型如果方法没有返回值,返回值类型为voidpublicclassStudent{Stringname="张三";publicStringgetName(){
returnname;
}
//……}return表达式;作用:跳出方法、返回结果语法27/38publicclassStudent{Stringname="张三";publicvoidgetName(){
}
//……}方法调用方法是个“黑匣子”,完成某个特定的应用程序功能,并返回结果方法调用:执行方法中包含的语句
对象名.方法名();小明过生日,爸爸送他一个电动狮子玩具,编程测试这个狮子能否正常工作语法问题28/38方法调用publicclassAutoLion{Stringcolor="黄色";//颜色
/*跑*/publicvoidrun(){System.out.println("正在以0.1米/秒的速度向前奔跑。");}/*叫*/publicStringbark(){Stringsound="大声吼叫";returnsound;}/*获得颜色*/publicStringgetColor(){returncolor;}/*显示狮子特性*/publicStringshowLion(){return"这是一个"+getColor()+"的玩具狮子!";}}publicclassTestLion{
publicstaticvoidmain(String[]args){AutoLionlion=newAutoLion();System.out.println(lion.showLion());lion.run();System.out.println(lion.bark());}}在类的方法中调用该类另一个方法在main()方法中调用类的方法29/38方法调用小结方法之间允许相互调用,不需要知道方法的具体实现,实现重用,提高效率
情况举例Student类的方法a()调用Student类的方法b(),直接调用publicvoida(){b();//调用b()}Student类的方法a()调用Teacher类的方法b(),先创建类对象,然后使用“.”调用publicvoida(){Teachert=newTeacher();
t.b();//调用Teacher类的b()}30/38publicclassStudent1{ publicvoidshowInfo(){
return"我是一名学生"; }}方法的返回值类型为void,方法中不能有return返回值!常见错误4-1代码阅读31/38注意publicclassStudent2{ publicdoublegetInfo(){ doubleweight=95.5; doubleheight=1.69; returnweight,height; }}方法不能返回多个值!常见错误4-2代码阅读32/38注意publicclassStudent3{ publicStringshowInfo(){ return"我是一名学生"; publicdoublegetInfo(){
doubleweight=95.5;
doubleheight=1.69; returnweight; } }}多个方法不能相互嵌套定义!常见错误4-3publicclassStudent3{ publicStringshowInfo(){ return"我是一名学生"; } publicdoublegetInfo(){ doubleweight=95.5;
doubleheight=1.69; returnweight; }}代码阅读33/38注意publicclassStudent4{ intage=20;
if(age<20){ System.out.println("年龄不符合入学要求!"); } publicvoidshowInfo(){ return"我是一名学生"; }}不能在方法外部直接写程序逻辑代码!常见错误4-4代码阅读34/38注意本章目标会定义和使用类的方法理解变量作用域会添加JavaDoc注释35/38成员变量和局部变量2-1变量声明的位置决定变量作用域变量作用域确定可在程序中按变量名访问该变量的区域//…for(inta=0;a<4;a++){System.out.println("hello");}System.out.println(a);//…代码错误a的作用域仅在for循环中36/38成员变量和局部变量2-2谁能使用这些变量?37/38变量1类型变量1;变量2类型变量2;变量3类型变量3;public返回类型方法1(){
变量4类型变量4;}public返回类型方法2(){
变量5类型变量5;}publicclassAutoLion{}AutoLion类的方法,其他类的方法方法1方法2成员变量局部变量局部变量问题成员变量和局部变量的区别作用域不同局部变量的作用域仅限于定义它的方法成员变量的作用域在整个类内部都是可见的初始值不同Java会给成员变量一个初始值Java不会给局部变量赋予初始值在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级在同一个方法中,不允许有同名局部变量在不同的方法中,可以有同名局部变量注意38/38publicclassTest{intscore1=88;intscore2=98;publicvoidcalcAvg(){intavg=(score1+score2)/2;}publicvoidshowAvg(){System.out.println("平均分是:"+avg);}}常见错误局部变量avg的作用域仅限于calcAvg()方法代码阅读39/38注意publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.print("请输入Java成绩:");intjava=input.nextInt();
//……/*计算并显示输出*/inttotal=java+c+db;doubleavg=total/3;System.out.print("总成绩:"+total);System.out.print("\n平均分:"+avg);}面向对象的编程〔OOP〕ScoreCalc类和
Test类calcDiffTimecalcTotalScore()ScoreCalcshowTotalScore()calcAvg()showAvg()
main(){//程序入口
//计算并输出总成绩
//计算并输出平均分
}Test调用调用类的方法实现某个特定的功能,其他类不需要知道它如何实现,调用方法就可以了,不用重复写代码!面向对象(OO)思想40/38如果还要再执行这个功能,难道还要重复再写一遍?本章目标会定义和使用类的方法理解变量作用域会添加JavaDoc注释41/38JavaDoc注释回忆学过的注释方式单行注释://这里是单行注释多行注释:/*这里是多行注释,可以多行*/JavaDoc注释:使用“/**”开始和“*/”结束,用来注释类、属性和方法等/**
*mySchool类
*@authorJohn
*@version1.02016/06/21
*/描述信息@author:描述作者信息@version:描述版本信息42/38添加JavaDoc注释为ScoreCalc类添加JavaDoc注释/***ScoreCalc类*@author张小明*@version2.02013/06/01*/publicclassScoreCalc{ /**Java成绩*/ intjava;
//... /** *计算总成绩 *@returntotal */ publicintcalcTotalScore(){ inttotal=java+c+db; returntotal; }
//...}方法的JavaDoc注释属性的JavaDoc注释类的JavaDoc注释问题43/38如何生成JavaDoc文档JavaDoc能够从源代码中抽取类、属性、方法等的注释,形成一个配套的API帮助文档生成JavaDoc文档使用命令行方式生成使用MyEclipse工具生成44/38总结定义类的方法必须包括以下三个局部方法的名称方法返回值的类型方法的主体类的方法调用,使用如下两种形式同一个类中的方法,直接使用“方法名()”调用不同类的方法,首先创立对象,再使用“对象名.方法名()”来调用在Java中,有成员变量和局部变量,它们的作用域各不相同JavaDoc注释以“/**”开头,以“*/”结尾45/38本章目标会定义带参方法会使用带参方法会创立包组织Java工程46/40为什么要用带参数的方法工作原理新鲜桃汁新鲜苹果汁新鲜梨汁输出三种果汁47/40如何使用带参数的方法3-1定义带参数的方法调用带参数的方法publicclassZhazhiJi{
publicStringzhazhi(Stringfruit){Stringjuice=fruit+"汁";returnjuice;}}/*调用zhazhi方法*/ZhazhiJimyZhazhiji=newZhazhiJi();StringmyFruit="苹果";StringmyJuice=myZhazhi.zhazhi(myFruit);System.out.println(myJuice);参数列表:(数据类型参数1,数据类型参数2…)调用方法,传递的参数要与参数列表一一对应48/40如何使用带参数的方法3-2<访问修饰符>返回类型<方法名>(<形式参数列表>){ //方法的主体}该方法允许被访问调用的权限范围方法返回值的类型publicclassStudentsBiz{ String[]names=newString[30];
publicvoidaddName(Stringname){
//增加学生姓名
} publicvoidshowNames(){//显示全部学生姓名 }}传送给方法的形参列表一个形式参数没有返回值语法示例定义带参数的方法49/40如何使用带参数的方法3-3publicstaticvoidmain(String[]args){
StudentsBizst=newStudentsBiz();Scannerinput=newScanner(System.in);for(inti=0;i<5;i++){System.out.print("请输入学生姓名:");StringnewName=input.next();
st.addName(newName);}st.showNames();
}实参的类型、数量、顺序都要与形参一一对应先实例化对象,再使用方法调用带参数的方法对象名.方法名〔参数1,参数2,……,参数n〕实参列表语法示例50/40带多个参数的方法2-1设计方法,通过传递三个参数〔开始位置、结束位置、查找的姓名〕来实现在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功问题分析51/40
publicbooleansearchName
(intstart,intend,Stringname){ booleanfind=false;//是否找到标识 //指定区间数组中,查找姓名 for(inti=start-1;i<end;i++){
if(names[i].equals(name)){
find=true;
break;
} } returnfind;}返回值类型带有三个形参返回结果:boolean类型带多个参数的方法2-2if(st.searchName(s,e,name)){ System.out.println("找到了!");}else{ System.out.println("没找到该学生!");}传递三个实参示例52/40//方法定义publicvoidaddName(Stringname){ //方法体}//方法调用对象名.addName(String"张三");调用方法时不能指定实参类型!常见错误4-1对象名.addName("张三");代码阅读注意53/40//方法定义publicbooleansearchName(intstart,intend,Stringname){ //方法体}//方法调用Strings="开始";inte=3;Stringname="张三";booleanflag=对象名.searchName(s,e,name);形参和实参数据类型不一致!常见错误4-2代码阅读注意54/40//方法定义publicbooleansearchName(intstart,intend,Stringname){ //方法体}//方法调用ints=1;inte=3;booleanflag=对象名.searchName(s,e);形参和实参数量不一致!常见错误4-3代码阅读注意55/40//方法定义publicbooleansearchName(intstart,intend,Stringname){ //方法体}//方法调用ints=1;inte=3;Stringname="张三";对象名.searchName(s,e,name);调用方法后没有对返回值作任何处理!常见错误4-4代码阅读注意56/40数组作为参数的方法2-1将5位学员的决赛成绩保存在数组中设计求平均成绩、最高成绩的方法,并把数组作为参数有5位学员参加了Java知识竞赛的决赛,输出决赛的平均成绩和最高成绩问题分析57/40publicdoublecalAvg(int[]scores){intsum=0;doubleavg=0.0;for(inti=0;i<scores.length;i++){sum+=scores[i];}avg=(double)sum/scores.length;returnavg;}返回值类型数组作为参数的方法2-2示例publicintcalMax(int[]scores){intmax=scores[0];for(inti=1;i<scores.length;i++){if(max<scores[i]){max=scores[i];}}returnmax;}int[]scores=newint[5];//保存比赛成绩//……doubleavgScore=st.calAvg(scores);intmaxScore=st.calMax(scores);数组参数调用方法58/40对象作为参数的方法2-1方式一:设计带四个参数〔学号、姓名、年龄、成绩〕的方法方式二:将学生学号、姓名、年龄、成绩封装在学生对象中,设计方法,以学生对象作为参数在实现了增加一个学生姓名的根底上,增加学生的学号、年龄和成绩,并显示这些信息,如何实现?问题分析可以将多个相关的信息封装成对象,作为参数传递,防止方法有太多的参数!经验59/40classStudent{
publicintid;publicStringname;publicintage;publicintscore; publicvoidshowInfo(){ System.out.println(id+"\t"+name+"\t"+age+"\t"+score);}}学生类对象作为参数的方法2-2示例publicvoidaddStudent(Studentstu){for(inti=0;i<students.length;i++){if(students[i]==null){students[i]=stu;break;}}//……studentsBiz.addStudent(student1);studentsBiz.addStudent(student2);对象参数调用方法60/40本章目标会定义带参方法会使用带参方法会创立包组织Java工程61/40为什么需要包Windows树形文件系统文档分门别类,易于查找和管理使用目录解决文件同名冲突问题如何存放两个同名的类而不冲突?Sort.java插入排序Sort.java冒泡排序问题62/40包解决类的同名问题允许类组成较小的单元〔类似文件夹〕,易于找到和使用相应的文件防止命名冲突更好的保护类、属性和方法Sort.java包63/40如何创立包packageedu.swjtu.javaclass;//声明包publicclassMySchool{//……publicStringtoString(){//……}}包名用package声明包,以分号结尾作为Java源代码第一条语句示例64/40包命名标准包名由小写字母组成,不能以圆点开头或结尾包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
包名后续局部依不同机构内部的标准不同而不同packagemypackage;package
net.javagroup.mypackage;package
net.javagroup.research.powerproject;部门名工程名package.mypackage;×65/40用MyEclipse创立包使用MyEclipse创立包的两种方法分别创立包和类创立类的过程中创立类所在的包66/40包与目录的关系创立好的包和Java源文件是如何存储的?创立包edu.swjtu.javaclass,即创立了目录结构:edu\swjtu\javaclasseduswjtujavaclassMySchool.javaHelloAccp.java问题67/40如何导入包为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类importjava.util.*;//导入java.util包中所有类关键字import并不陌生import包名.类名;1.系统包:java.util2.自定义包:*:指包中的所有类MySchool:指包中的AccpSchool类语法68/40总结带参方法定义的一般形式形参是在定义方法时对参数的称呼实参是在调用方法时传递给方法的实际的值调用带参方法时要求实参与形参要匹配创立包使用关键字package导入包使用关键字import<访问修饰符>返回类型<方法名>(<参数列表>){//方法的主体}69/4070目录2.1方法重载2.2类的访问控制2.3构造方法2.4类变量2.5应用举例71方法重载方法重载一个类中名字相同的多个方法这些方法的参数必须不同,Java可通过参数列表的不同来区分重载的方法或者参数个数不同或者参数类型不同返回值可以相同,也可以不同重载的价值在于它允许通过使用一个方法名来访问多个方法1方法重载72通过方法重载分别接收一个或几个不同数据类型的数据classMethodOverloading{ publicvoidreceive(inti){ System.out.println("Receiveoneintparameter."); System.out.println("i="+i); } publicvoidreceive(doubled){ System.out.println("Receiveonedoubleparameter."); System.out.println("d="+d); } publicvoidreceive(Strings){ System.out.println("ReceiveoneStringparameter."); System.out.println("s="+s); } 1方法重载方法重载(续)
——例73
publicvoidreceive(inti,intj){ System.out.println("Receivetwointparameters."); System.out.println("i="+i+"j="+j); } publicvoidreceive(inti,doubled){("Receiveoneintparameterandonedoubleparameter."); System.out.println("i="+i+"d="+d); } }publicclassExamp3_17{ publicstaticvoidmain(Stringargs[]){ MethodOverloadingm=newMethodOverloading(); m.receive(2); m.receive(5.6); m.receive(3,4); m.receive(7,8.2); m.receive("Isitfun?"); }}1方法重载方法重载(续)
——例74运行结果Receiveoneintparameter.i=2Receiveonedoubleparameter.d=5.6Receivetwointparameters.i=3j=4Receiveoneintparameterandonedoubleparameter.i=7d=8.2ReceiveoneStringparameter.s=Isitfun?1方法重载1方法重载(续)
——例运行结果75目录2.1方法重载2.2
类的访问控制2.3构造方法2.4类变量2.5应用举例什么是封装面向对象三大特征之一——封装封装的概念封装的好处封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问隐藏类的实现细节只能通过规定方法访问数据方便参加控制语句方便修改实现如何使用封装封装的步骤修改属性的可见性1在getter/setter方法中加入属性控制语句3创建公有的getter/setter方法2设为private用于属性的读写对属性值的合法性进行判断78类的访问控制类的访问控制只有public〔公共类〕及无修饰符〔缺省类〕两种访问权限符与访问能力之间的关系如表类型无修饰public同一包中的类yesyes不同包中的类noyes2类的访问控制类的访问控制79类成员的访问控制公有(public)可以被其他任何对象访问(前提是对类成员所在的类有访问权限)保护(protected)只可被同一类及其子类的实例对象访问私有(private)只能被这个类本身访问,在类外不可见默认(default)仅允许同一个包内的访问;又被称为“包〔package)访问权限”2类的访问控制类的访问控制80类型private无修饰protectedpublic同一类yesyesyesyes同一包中的子类noyesyesyes同一包中的非子类noyesyesyes不同包中的子类nonoyesyes不同包中的非子类nononoyes2类的访问控制类的访问控制(续)81Circle类,给实例变量加上private修饰符publicclassCircle{staticdoublePI=3.14159265;privateintradius; publicdoublecircumference(){return2*PI*radius;}}2类的访问控制类的访问控制(续)
——例82编译CircumferenceTester.javapublicclassCircumferenceTester{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();
c1.radius=50;Circlec2=newCircle();
c2.radius=10;
doublecircum1=c1.circumference();doublecircum2=c2.circumference();("Circle1hascircumference"+circum1);
("Circle2hascircumference"+circum2);
}}2类的访问控制2.2.6类的访问控制(续)
——例83编译时会提示出错在编译语句“c1.radius=50;”及“c2.radius=10;”时会提示存在语法错误“radiushasprivateaccessinCircle”说明由于在Circle类声明中变量radius被声明为private,因此在其它类中不能直接对radius进行存取如果要允许其它类访问radius的值,就需要在Circle类中声明相应的公有方法。通常有两类典型的方法用于访问属性值,get方法及set方法2类的访问控制类的访问控制(续)
——例编译84get方法功能是取得属性变量的值get方法名以“get”开头,后面是实例变量的名字一般具有以下格式:public<fieldType>get<FieldName>(){return<fieldName>;}对于实例变量radius,声明其get方法如下:publicintgetRadius(){returnradius;}2类的访问控制类的访问控制(续)
——get方法85set方法功能是修改属性变量的值set方法名以“set”开头,后面是实例变量的名字一般具有以下格式publicvoidset<FieldName>(<fieldType><paramName>){<fieldName>=<paramName>;}声明实例变量radius的set方法如下:publicvoidsetRadius(intr){radius=r;}2类的访问控制类的访问控制(续)
——set方法86关键字this的使用如果形式参数名与实例变量名相同,那么需要在实例变量名之前加this关键字,否那么系统会将实例变量当成形式参数。在上面的set方法中,如果形式参数为radius,那么需要在成员变量radius之前加上关键字this。代码如下:publicvoidsetRadius(intradius){this.radius=radius;}2类的访问控制类的访问控制(续)
——set方法87目录2.1方法重载2.2类的访问控制2.3构造方法2.4类变量2.5应用举例88构造方法构造方法一种和类同名的特殊方法用来初始化对象Java中的每个类都有构造方法,用来初始化该类的一个新的对象没有定义构造方法的类,系统自动提供默认的构造方法3构造方法89构造方法的特点方法名与类名相同没有返回类型,修饰符void也不能有通常被声明为公有的(public)可以有任意多个参数主要作用是完成对象的初始化工作不能在程序中显式的调用在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化构造方法(续)3构造方法90系统提供的默认构造方法如果在类的声明中没有声明构造方法,那么Java编译器会提供一个默认的构造方法默认的构造方法没有参数,其方法体为空使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,那么对象的属性值为零或空3构造方法构造方法(续)
——默认构造方法91声明一个银行帐号类及测试代码publicclassBankAccount{ StringownerName;intaccountNumber;float
balance;}publicclassBankTester{publicstaticvoidmain(Stringargs[]){ BankAccountmyAccount=newBankAccount(); System.out.println("ownerName="+
myAccount.ownerName);System.out.println("accountNumber="+
myAccount.accountNumber); System.out.println("balance="+myAccount.balance); }}3构造方法构造方法(续)
——例(默认构造方法)92运行结果ownerName=nullaccountNumber=0balance=0.03构造方法构造方法(续)
——例
运行结果93自定义构造方法与方法重载可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化构造方法可以被重载,构造方法的重载和方法的重载一致一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,Java可以通过参数列表的不同来区分应调用哪一个方法3构造方法构造方法(续)
——自定义构造方法94为BankAccount声明一个有三个参数的构造方法publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;}假设一个新帐号的初始余额可以为0,那么可增加一个带有两个参数的构造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;}3构造方法构造方法(续)
——例95自定义无参的构造方法无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,那么要求其子类声明时必须声明构造方法,否那么在子类对象的初始化时会出错3构造方法构造方法(续)
——自定义无参构造方法96构建一个Bush类,有两个有参数的构造方法classBush{ Bush(inti){}Bush(doubled){}}如果写:newBush();编译器将要告诉你找不到对应的构造方法说明用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认〔无参〕的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法3构造方法构造方法(续)
——Bush.java97在例根底上再声明一个无参的构造方法publicBankAccount(){ownerName="";accountNumber=999999;balance=0.0f;}3构造方法构造方法(续)
——例98目录2.1方法重载2.2类的访问控制2.3构造方法2.4类变量2.5应用举例99类变量也称为静态变量,声明时需加static修饰符不管类的对象有多少,类变量只存在一份,在整个类中只有一个值类初始化的同时就被赋值适用情况类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值引用格式<类名|实例名>.<类变量名>4类变量1004类变量101对于一个圆类的所有对象,计算圆的面积时,都需用到π的值,可在Circle类的声明中增加一个类属性PIpublicclassCircle{
staticdoublePI=3.14159265;intradius;}当我们生成Circle类的实例时,在每一个实例中并没有存储PI的值,PI的值存储在类中4类变量例102对类变量进行测试publicclassClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);
Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}测试结果3.141592653.141592653.143.14例运行结果4类变量103声明一个Point类,有两个私有变量保存点坐标,一个类变量保存已有点的个数publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){this.x=x;this.y=y;pointCount++;}}4类变量
——Point.java104测试类classex2_4{ publicstaticvoidmain(String[]args){ Pointp=newPoint(1,1);System.out.println(p.pointCount); Pointq=newPoint(2,2); System.out.println(q.pointCount); System.out.println(q.pointCount==Point.pointCount); System.out.println(Point.pointCount); }}4类变量——Point类测试105测试结果12true24类变量
——Point类测试结果106目录2.1方法重载2.2类的访问控制2.3构造方法2.4类变量2.5应用举例107对银行帐户类BankAccount进行一系列修改和测试声明BankAccount类声明toString()方法声明存取款方法使用DecimalFormat类声明类方法生成特殊的实例声明类变量应用举例5应用举例108包括状态、构造方法、get方法及set方法publicclassBankAccount{ privateStringownerName; privateintaccountNumber; privatefloatbalance; publicBankAccount(){ this("",0,0); } publicBankAccount(StringinitName,intinitAccNum,floatinitBal){ ownerName=initName; accountNumber=initAccNum; balance=initBal; } 5.1声明BankAccount类5应用举例109publicStringgetOwnerName(){returnownerName;}publicintgetAccountNumber(){returnaccountNumber;}publicfloatgetBalance(){returnbalance;}publicvoidsetOwnerName(StringnewName){ownerName=newName;}publicvoidsetAccountNumber(intnewNum){accountNumber=newNum;}publicvoidsetBalance(floatnewBalance){balance=newBalance;}}5应用举例5.1声明BankAccount类(续)
——BankAccount.java110声明测试类AccountTesterpublicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);
anAccount.setBalance(anAccount.getBalance()+100);System.out.println("Hereistheaccount:"+anAccount);System.out.println("Accountname:"+
anAccount.getOwnerName());System.out.println("Accountnumber:"+ anAccount.getAccountNumber());System.out.println("Balance:$"+anAccount.getBalance());}}5应用举例5.1声明BankAccount类(续)
——AccountTester.java111测试结果Hereistheaccount:BankAccount@372a1aAccountname:ZhangLiAccountnumber:100023Balance:$100.05应用举例5.1声明BankAccount类(续)
——AccountTester测试结果112给BankAccount类增加存款及取款方法//存款
publicfloatdeposit(floatanAmount){balance+=anAmount;return(balance);}
//取款
publicfloatwithdraw(floatanAmount){balance-=anAmount;return(anAmount);}5.2声明存取款方法5应用举例113publicclassAccountTester{publicstaticvoidmain(Stringargs[]){BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println(anAccount);System.out.println();anAccount=newBankAccount("WangFang",100024,0);System.out.println(anAccount);
anAccount.deposit(225.67f);
anAccount.deposit(300.00f);System.out.println(anAccount);
anAccount.withdraw(400.17f);System.out.println(anAccount);}}5应用举例5.2
声明存取款方法(续)
——修改AccountTester.java114测试结果Account#100023withbalance$100.0Account#100024withbalance$0.0Account#100024withbalance$525.67Account#100024withbalance$125.499975应用举例5.2
声明存取款方法(续)
——测试结果115DecimalFormat类在java.text包中在toString()方法中使用DecimalFormat类的实例方法format对数据进行格式化修改后的toString()方法如下publicStringtoString(){return("Account#"+accountNumber+"withbalance"+("$0.00").format(balance));}5应用举例5.3
使用DecimalFormat类116对BankAccount类重新进行编译,再运行BankTester类,运行结果如下Account#100023withbalance$100.00Account#100024withbalance$0.00Account#100024withbalance$525.67Account#100024withbalance$125.505应用举例5.3
使用DecimalFormat类(续)
——测试结果117声明类方法返回特殊的BankAccount实例,作用是生成特定的几种账号样例example1()方法publicstaticBankAccountexample1(){BankAccountba=newBankAccount(); ba.setOwnerName("LiHong"); ba.setAccountNumber(554000); ba.deposit(1000); returnba;}
2.5应用举例5.4
使用类方法生成特殊的实例118example2()publicstaticBankAccountexample2(){BankAccountba=newBankAccount();ba.setOwnerName("ZhaoWei");ba.setAccountNumber(554001);ba.deposit(1000);ba.deposit(2000);returnba;}2.5应用举例5.4使用类方法生成特殊的实例(续)
——example2()方法119emptyAccountExample()publicstaticBankAccountemptyAccountExample(){ BankAccountba=newBankAccount(); ba.setOwnerName("HeLi"); ba.setAccountNumber(554002); returnba;
}2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年建筑安装工程项目合同
- 力课件教学课件
- 2024年广告代理合作协议
- 2024年工程咨询与技术服务合作协议
- 2024年度公司用车管理协议
- 2024年度建筑工程设计、施工购销合同
- 2024年度35kv高压线路施工合同
- 2024年度某影视公司与某投资公司关于某电影项目融资的合同
- 公司年会的演讲稿模板八篇
- 为世界无车日活动宣传标语(155句)
- 2024年中国南水北调集团水网水务投资限公司及下属单位社会招聘高频难、易错点500题模拟试题附带答案详解
- (新版)食品生产企业食品安全员理论考试题库500题(含答案)
- 七年级语文上册第13课《纪念白求恩》公开课一等奖创新教案
- 统编版语文六年级上册第八单元大单元整体教学设计
- 教师个人业务学习笔记(41篇)
- 2025年高考语文复习备考复习策略讲座
- 数学史上的三次数学危机
- 2024年水电暖安装承包合同
- 缺乳(乳汁淤积)产妇的中医护理
- 2024北师大版新教材初中数学七年级上册内容解读课件(深度)
- 2024年公共营养师三级考试试卷及答案
评论
0/150
提交评论