第3章Java面向对象特性本章内容3.1类与对象3.2隐藏和封装3.3类的继承与多态3.4数组学习目标1.掌握对象与类的基本概念2.了解对象的生命周期3.熟练掌握类的定义及实例化4.理解隐藏与封装5.熟练掌握类的继承与多态6.掌握数组的应用3.1类与对象1.类与对象的定义2.成员变量与局部变量3.成员方法4.对象的创建5.对象的使用3.1类与对象6.对象的消除7.方法重载8.this9.构造方法1.类和对象的定义•Java程序是由一个或若干个类组成,类是Java程序的基本组成单位,包括:成员变量:描述对象的属性成员方法:描述对象的行为•类是一个模板•对象是在其类模型基础上构造出的,是具体的实例。类定义的结构publicclassApple{Stringcolor;floatprice;intnum;publicApple(){color=Red;price=8.34f;num=10;}publicfloatcount(){returnprice*num;}publicstaticvoidmain(String[]args){Appleapple=newApple();System.out.println(苹果颜色:+apple.color);System.out.println(苹果总价钱:+apple.count());}}类声明类体成员变量构造方法方法类的声明格式[public][abstract|final]classclassName[extendssuperClassName][implementsinterfaceNameList]类的访问权限及其属性类定义的关键字类名继承某个父类的关键字实现接口的关键字类体•构造和初始化新对象的构造方法;•表示类及其对象状态的变量;•实现类及其对象的方法;•进行对象清除的finalize()方法。2.成员变量与局部变量•当一个变量的声明出现在类体中,并且不属于任何一个方法时,该变量称为类的成员变量。•在方法体中声明的变量以及方法的参数则统称为方法的局部变量。【例3-1】成员变量示例1.publicclassApple{2.publicStringcolor;//公共变量color3.publicstaticintnum;//静态变量num4.publicfinalbooleanMATURE=true;//常量MATURE并赋值5.publicstaticvoidmain(String[]args){6.System.out.println(苹果数量:+Apple.num);7.Appleapple=newApple();8.System.out.println(苹果颜色:+apple.color);9.System.out.println(苹果是否成熟:+apple.MATURE);10.}11.}num是类变量(即静态变量),可以通过类名直接访问【执行结果】•苹果数量:0苹果颜色:null苹果是否成熟:true局部变量不能使用关键词public、protected、private和static对其进行修饰。其语法格式如下:[final]typevaribleName;指定局部变量为常量局部变量的参数类型局部变量的名称【例3-2】局部变量的使用1.publicclassApple{2.Stringcolor=Red;3.floatprice;4.publicStringgetColor(){5.returncolor;6.}7.publicfloatcount(){8.intnum;9.if(num0)10.return0;11.else12.returnprice*num;13.}成员变量局部变量错误语句,因为局部变量num还没有被赋值就使用14.publicstaticvoidmain(String[]args){15.Appleapple=newApple();16.System.out.println(苹果总价钱:+apple.count());17.}18.}变量的有效范围是指该变量在程序代码中的作用区域,在该区域外不能直接访问变量。•成员变量——类体中声明的成员变量在整个类中有效。•局部变量——在复合代码块内声明的变量,只在当前复合代码块内有效;在复合代码块以外、方法体内声明的变量在整个方法内都有效。【例3-3】成员变量与局部变量的有效范围1.publicclassOlympics1{2.privateintmedal_All=800;3.publicvoidChina(){4.intmedal_CN=100;5.if(medal_CN1000){6.intgold=50;7.medal_CN+=30;8.medal_All-=130;9.}10.}11.}成员变量代码块外、方法体内的局部变量代码块的局部变量允许访问本方法的局部变量允许访问本类的成员变量3.成员方法返回值类型方法名称{//方法开始标记}//方法结束标记方法主体(参数1,参数2,……参数n)注意:•方法体中定义的局部变量的作用域只在方法内部;•如果局部变量的名字和类的成员变量的名字相同,则类的成员变量被屏蔽;•如果要在方法中使类的成员变量有效,则可以使用this关键字。publicclassOlympics2{privateintgold=0;privateintsilver=0;privateintcopper=0;publicvoidchangeModel(inta,intb,intc){gold=a;//给类的成员变量赋值intsilver=b;//使同名类成员变量silver隐藏intcopper=50;//使同名类成员变量copper隐藏System.out.println(“InchangModel:”+“金牌=”+gold+“银牌=”+silver+“铜牌+copper);this.copper=c;//给类成员变量z赋值}StringgetModel(){return“金牌=”+gold+“银牌=”+silver+“铜牌=+copper;}publicstaticvoidmain(Stringargs[]){Olympics2o2=newOlympics2();System.out.println(BeforechangModel:+o2.getModel());o2.changeModel(100,100,100);System.out.println(AfterchangeModel:+o2.getModel());}}BeforchangModel:金牌=0银牌=0铜牌=0gold=100silver=100copper=50InchangModel:金牌=100银牌=100铜牌=50AfterchangModel:金牌=100银牌=0铜牌=100如果在方法中对成员变量的值进行了修改,则这种修改将是永久的。gold=0silver=0copper=04.对象的创建•一个对象的生命周期包括三个阶段:对象的创建对象的使用对象的消除创建对象创建对象声明实例化初始化类对象名称=new构造方法(参数)publicclassPoint{intx=1;inty=1;publicPoint(intx,inty){this.x=x;this.y=y;}}//实例化Point类,创建对象ptPointpt=newPoint(2,3);Pointpt=newPoint(2,3);nullpt引用空间00xy230x3a478b0x3a478b5.对象的使用1.引用对象的变量•objectReference.variableName;2.调用对象的方法•objectReference.methodName(argumentList)【例3-6】对象使用的示例1.publicclassPoint{2.intx=1;3.inty=1;4.publicvoidsetXY(intx,inty){……}5.publicintgetXY(){……}6.publicstaticvoidmain(String[]args){7.Pointpt=newPoint();8.pt.x=2;9.System.out.println(x与y的乘积为:+pt.getXY());10.pt.setXY(3,2);11.System.out.println(x与y的乘积为:+pt.getXY());12.}13.}成员变量成员方法声明并创建Point类的对象pt访问对象pt的成员变量x调用成员方法【执行结果】•x与y的乘积为:2x与y的乘积为:66.对象的消除•在C++中,程序员要显式地删除不用的对象,即手动释放对象占用的存储空间。•Java提供了垃圾回收(garbagecollection)机制:自动判断对象是否还在使用,并自动销毁不再使用的对象,回收对象所占用的资源。Java垃圾回收器执行机制的生命周期可触及状态不再被引用当前对象或其它对象的finalize()方法当前对象或其它对象的finalize()方法回收内存生命周期的开始生命周期的终止new语句可复活状态不可触及状态7.方法的重载•在同一个类中定义了多个同名而内容不同的成员方法classScreen{publicvoidprint(inti){…}publicvoidprint(floati){…}publicvoidprint(inti,Stringstr){…}}方法重载•重载必须遵守原则:参数表必须不同,以此区分不同方法体方法参数的个数不同参数类型不同返回类型、修饰符可相同或不相同返回类型不能用来区分重载的方法•多态性:实现了Java的编译时多态【例3-7】方法重载的示例1.publicclassCalculate{2.finalfloatPI=3.14159f;3.publicfloatgetArea(floatr){4.returnPI*r*r;5.}6.publicfloatgetArea(floatl,floatw){7.returnl*w;8.}9.publicvoiddraw(intnum){10.System.out.println(画+num+个任意形状的图形);11.}12.publicvoiddraw(Stringshape){13.System.out.println(画一个+shape);14.}方法重载方法重载15.publicstaticvoidmain(String[]args){16.Calculatec=newCalculate();//创建Calculate类的对象17.floatl=20;18.floatw=40;19.System.out.println(求长为+l+宽为+w+的矩形面积是:+c.getArea(l,w));20.floatr=6;21.System.out.println(求半径为+r+的圆形面积是:+c.getArea(r));22.intnum=8;23.c.draw(num);24.c.draw(“矩形”);25.}26.}通过传递的参数判断调用哪个方法通过传递的参数判断调用哪个方法【执行结果】•求长为20.0宽为40.0的矩形面积是:800.0求半径为6.0的圆形面积是:113.097244画8个任意形状的图形画一个矩形8.this•用来指向对象自身用来访问当前对象的数据成员;用来访问当前对象的成员方法;重载构造方法时,用来引用同类的其他构造方法。【例3-8】this关键字的使用1.publicclassFruit{2.Stringcolor=绿色;3.doubleprice;4.intnum;5.pubilcvoidharvest(){6.Stringcolor=红色;7.System.out.println(水果原来是:+this.color+的!);8.System.out.println(水果已经收获);9.System.out.pr