第3章面向对象的核心特性_第1页
第3章面向对象的核心特性_第2页
第3章面向对象的核心特性_第3页
第3章面向对象的核心特性_第4页
第3章面向对象的核心特性_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海大学CIMS和机器人中心Java在工程中的应用本科生课程:09326080刘丽兰2023年2月6日姓名:刘丽兰学科专业:机械制造及自动化联系电话:56331763E-Mail:llliu@

上海大学机电工程与自动化学院2023年2月6日第3章面向对象的核心特性3.1类和对象3.2类的封装性3.3类的继承性3.4类的多态性3.5抽象类和最终类第3章面向对象的核心特性3.1类和对象3.2类的封装性3.3类的继承性3.4类的多态性3.5抽象类和最终类面向对象的概念——对象对象有两个层次的概念:现实生活中对象指的是客观世界的实体;程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。变量方法3.1类和对象现实生活中的对象可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型称为类(Class)。classCar{intcolor_number;intdoor_number;intspeed;

voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}

抽象数据类型3.1类和对象面向对象的概念——对象面向对象的概念——类类是描述对象的“基本原型”,它定义一类对象所能拥有的数据和能完成的操作。在面向对象的程序设计中,类是程序的基本单元。相似的对象可以归并到同一个类中去,就像传统语言中的变量与类型关系一样。

程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。3.1类和对象……Carcar1;Carcar2;……CarcarN;3.1类和对象

面向对象的概念——类变量:指对象的所知道的状态。方法:指对象的功能单元。消息 软件对象通过相互间传递消息来相互作用和通信,一个消息由三部分组成:

1.接受消息的对象

2.接收对象要采取的方法

3.方法需要的参数对象B对象A消息3.1类和对象

面向对象的概念——类一个例子在程序中所操作的对象是类的一个实例。创建一个对象:Helloobj=newHello();调用方法:obj.showString();

调用对象的方法相当于给对象发送消息,收到消息的对象通过改变自身的状态或者向其它对象发送消息来响应消息。classHello{

}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}变量方法showString()方法changeString()3.1类和对象

面向对象的概念——类

为什么要使用类?采用简单数据类型表示现实世界中概念存在很大的局限性。例如:采用int型数据表示一个日期概念,需要使用3个变量:

intday,month,year;如果要表示2个人的生日,就要使用6个变量并且在使用中必须时刻注意三者的联系和约束关系同时在使用日期概念时要同时对三个变量进行访问

使用类可以把现实问题中的对象映射为程序中的一个整体——类。3.1类和对象

面向对象的概念——类类中不但有变量,还有与之相关的操作所定义的方法。将变量和方法封装在一个类中,可以对成员变量进行隐藏,外部对类成员的访问都通过方法进行,能够保护类成员不被非法修改。classBirthDate{publicintday,month,year;publicinttomorrow(){……}}BirthDatemybirth,yourbirth;BirthDatedate;外部要获得当前日期的后一天时,只要调用:date.tomorrow();3.1类和对象

面向对象的概念——类

封装把对象的所有组成部分组合在一起私有数据

方法

方法数据对象A对象B公有数据封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。3.1类和对象

面向对象的概念——封装子类是作为另一个类的扩充或修正而定义的一个类。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass3.1类和对象

面向对象的概念——继承继承是子类利用父类中定义的方法和变量,就像它们属于子类本身一样。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){…}publicvoidadd_oil(){…}}

classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}}3.1类和对象

面向对象的概念——继承覆盖使得在子类中可以重新定义父类中已有的方法,从而体现出子类自己的行为。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){speed=0;}publicvoidadd_oil(){…}}

classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}

publicvoidpush_break(){speed=speed–10;}}3.1类和对象

面向对象的概念——方法的覆盖重载指的是在同一个类中至少有两个方法用同一个名字,但有不同的参数。类voidshow(intint_num)voidshow(doubledouble_num)voidshow(intint_num,floatfloat_num)1231.23123,1.233.1类和对象

面向对象的概念——方法的重载(多态性)3.1类和对象publicclassCar{intcar_number;voidset_number(intcar_num){car_number=car_num;}voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}publicstaticvoidmain(Stringargs[]){CarDemocar=newCar();Democar.set_number(3838);Democar.show_number();}}输出结果:MycarNo.is:3838阅读程序,给出结果3.1类和对象Java定义类

类定义的格式:

类声明+类主体类声明{

成员变量的声明;

成员方法的声明及实现;}1)声明类[修饰符]class类<泛型>[extends父类][implements接口列表]修饰类的关键字:[public][abstract|final]类名首字母大写例:publicclassDate1声明了一个类Date1;该类是公有类,可被所有类访问。classHello{

}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}变量方法showString()方法changeString()第4周回顾字符串双引号,Stringstr=“abc”;字符串长度:str.length字符串比较:str.equals(Stringstrb)指定位置字符:str.charAt(i)字符串的子串:str.substring(int,int)对象、类的概念客观世界的对象是物理实体类是对客观对象的抽象:状态→变量,行为→方法;程序中的对象是类的实例;面向对象的三个特性:封装、继承、多态3.1类和对象Java定义类2)声明成员变量[修饰符][static][final][transient]数据类型变量;例如:publicclassDate1 //类声明{intyear,month,day; //声明成员变量}[public|protected|private]类成员变量常量临时变量3.1类和对象Java定义类3)声明成员方法方法声明语法[修饰符]

返回值类型方法([参数列表])[throws异常类]{

语句序列;[return[返回值]];}[public|protected|private][static][final|abstract][native][synchronized]返回值类型可以是任意的Java数据类型,当一个方法不需要返回值时,返回值类型为void。参数的类型可以是简单数据类型,也可以是引用数据类型(数组、类或接口)。方法声明中的参数为形式参数,仅限于声明它的方法之内。方法体是对方法的实现。它包括局部变量的声明以及所有合法的Java指令。方法体:方法的内容3.1类和对象Java定义类3)声明成员方法方法体中的局部变量方法体中声明的变量为局部变量;作用域限制在方法体中;不能为其赋初值方法体中用return语句返回值方法声明了返回值类型,必须用return;结果值的数据类型必须与方法声明的返回值类型一致;方法声明没有返回值,return省略;return通常作为方法体的最后一条语句。4)声明main方法程序从main()方法开始执行。必须声明如下:publicstaticvoidmain(Stringargs[])3.1类和对象Java使用对象:声明对象->实例化对象->引用对象的成员变量和调用对象方法->释放对象。1)声明对象类对象Date1aday; //声明aday是Date1类的一个对象2)对象实例化对象=new类的构造方法([参数列表])Date1aday;aday=newDate1();创建类的实例必须调用类的构造方法。使用new创建类的实例,为之分配内存并初始化。等价于:Date1aday=newDate1();publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){}}3.1类和对象Java使用对象3)引用对象的成员变量和调用对象方法对象.成员变量对象.成员方法([参数列表])对象与其成员变量或方法之间使用运算符“.”分割。如:aday.year=2006; //引用对象的成员变量aday.setDate(2006,1,28);//调用对象的方法3.1类和对象使用对象4)对象的引用模型:类是引用数据类型3.1类和对象使用对象5)方法调用时的参数传递原则基本数据类型参数传递值;引用数据类型参数传递引用。6)释放对象Java语言具有资源回收机制,能够跟踪存储单元的使用情况,自动收回不再被使用的资源。3.1类和对象publicclassTransdata{staticvoidchange(Strings,StringBuffersb){s=“aaaa”;

sb.setLength(0);sb.append(“aaaa”);}publicstaticvoidmain(Stringargs[]){Strings=“bbbb”;StringBuffersb=newStringBuffer(“bbbb”);change(s,sb);System.out.println(s);System.out.println(sb);}}输出结果:bbbbaaaa例:第3章面向对象的核心特性3.1类和对象3.2类的封装性3.3类的继承性3.4类的多态性3.5抽象类和最终类3.2类的封装性类的封装性的含义:将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位;类中既要提供与外部联系的方法,又要尽可能隐藏类的实现细节。封装性的作用:是面向对象的核心特征之一,提供信息隐藏技术。提供软件模块化的设计机制。使得类的设计和使用相分离。3.2类的封装性构造方法与析构方法构造方法 类的构造方法是类中一种特殊的成员方法,用于创建类的实例并初始化对象。声明构造方法

构造方法与类同名,返回该类的实例,不需要写返回值类型。

publicclassDate2{

publicDate2(inty,intm,intd) //声明构造方法

{//构造方法与类同名,构造方法返回该类的一个实例

year=y;month=m;day=d;}}使用new调用构造方法,参数必须符合构造方法的声明。如:Date2aday=newDate2(2006,1,28);3.2类的封装性构造方法与析构方法构造方法关于构造方法声明和使用的几点说明如果没有声明构造方法,Java自动为该类生成一个无参数的构造方法;如果声明了有参数的构造方法,则Java不再自动生成无参数构造方法;如果需要有多种参数的构造方法,需要将构造方法重载。构造方法与成员方法的不同之处作用不同:构造方法用于创建类的实例+成员变量初始化;成员方法实现对类中成员变量的操作;调用方式不同:构造方法需通过new运算符调用;成员方法通过对象调用。3.2类的封装性构造方法与析构方法析构方法:

也是类中一种特殊的成员方法,作用与构造方法相反,用于释放类的实例并执行特定操作。

publicvoidfinalize() //析构方法{

语句序列;}注意:一般不需要设计析构方法;不能使用已被析构方法释放的对象;一个类只能有一个finalize()方法,且不允许重载。3.2类的封装性方法的重载重载的含义一个类中有多个同名的方法带有不同的参数表,称为方法的重载。重载的价值:虽然一个方法有多种声明形式,但都表示相同的含义。程序运行时,调用与参数相匹配的重载方法。例:print();publicvoidprint(booleanb)publicvoidprint(charc)publicvoidprint(inti)publicvoidprint(doubled)3.2类的封装性方法的重载成员方法重载参数列表必须不同,即以不同的参数个数、参数类型、参数次序来区别重载方法;返回值可以相同,也可以不同,不能以不同的返回值来区别重载方法。例:publicsetDate(inty,intm,intd)publicsetDate(intm,intd) //重载方法,参数个数不同publicsetDate(intd)publicsetDate(Date1aday)publicsetDate(inty,intm,intd)publicsetDate(intm,intd,inty) //错误重载,参数列表相同3.2类的封装性方法的重载构造方法重载

publicclassDate2{ publicDate2() { //无参数的构造方法

year=2006; month=1; day=1; } publicDate2(inty,intm,intd){ //指定参数的构造方法,重载

year=y; month=m; day=d; } publicDate2(Date2aday){ //拷贝构造方法,重载

year=aday.year; month=aday.month; day=aday.day; }}3.2类的封装性方法的重载构造方法重载Date2aday1=newDate2();Date2aday2=newDate2(2006,2,28);Date2aday3=newDate2(aday2); //由已知对象创建新对 象图3.2使用拷贝构造方法复制对象3.2类的封装性this引用和instanceof对象运算符this引用:三种用法指代对象本身语法:this例:publicbooleanequals(Date2aday2){ Date2aday1=this;//this指调用本方法的当前对象

ruturnaday1.year==aday2.year; }访问本类的成员变量和成员方法this.成员变量this.成员方法([参数列表])当没有同名成员时,this引用可以省略。当成员方法的参数与成员变量同名时,this不可省略。如:publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){year=y;month=m;day=d;}}publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){this.year=y;this.month=m;this.day=d;}}等价于publicclassDate1{intyear,month,day;voidsetDate(intyear,intmonth,intday){

this.year=year;

this.month=month;

this.day=day;}}this不能省略3.2类的封装性this引用和instanceof对象运算符this引用:三种用法调用本类重载的构造方法this引用可用在重载的构造方法中,调用本类已定义的构造方法。this([参数列表]),如:publicDate2(inty,intm,intd){//指定参数的构造方法

year=y; month=m; day=d;}publicDate2(){ this(2006,1,1);//调用本类已定义的构造方法}注:在构造方法中,this()引用必须是第一行语句。3.2类的封装性this引用和instanceof对象运算符instanceof对象运算符判断一个对象是否属于指定类及其子类,返回boolean类型。例如:Date2aday=newDate2(2006,5,1);adayinstanceofDate2//返回true,aday是Date2类对象3.1类和对象课堂练习:引用数据类型作为方法的参数和返回值。要求:随机生成一个数组.

inttable[];找出数组中的最大值,输出.

intmax(inttable[])为数组从小到大排序,输出.

voidselectsort(inttable[])程序结构:publicclassArray1{ int[]random(intn){//随机生成一个数组 声明数组;

for循环随机生成数组; 返回数组地址;

} intmax(inttable[]){//找出数组中的最大值 声明最大值变量,赋初值;

for循环,取得最大值; 返回最大值变量;

} voidselectsort(inttable[]){ //为数组元素排序

2个for循环嵌套; 无返回值;

} publicstaticvoidmain(Stringargs[]){ //主函数,入口 创建Array1的实例对象; 实例对象调用random方法,生成数组; 实例对象调用max方法,输出最大值; 实例对象调用selectsort方法,输出;

}}第5周回顾定义类:[修饰符]class类<泛型>[extends父类][implements接口列表][修饰符][static][final][transient]数据类型变量;[修饰符]返回值类型方法([参数列表])[throws异常类]{}使用对象:

类对象=new类的构造方法([参数列表]);类的封装性构造方法和析构方法方法的重载:一般方法、构造方法This3.2类的封装性类及其成员的访问权限类中成员的访问权限注:public等访问权限不能修饰方法体中的局部变量。publicclassA{publicvoidB(inti){

publicintj; //错误

}}权限修饰符同一类同一包不同包的子类所有类public(公有)protected(保护)缺省private(私有)3.2类的封装性类及其成员的访问权限类的访问权限:只有public和缺省两种publicclassDate1 //公有的类classDate1_ex //默认的类注:一个源程序文件中可以声明多个类,但用public修饰的类只能有1个,并且该类名必须与文件名相同。程序结构I:publicclassArray1{ int[]random(intn) {

} intmax(inttable[]) { } voidselectsort(inttable[]) { } publicstaticvoidmain(Stringargs[]) { }}程序结构II:publicclassArray1{ int[]random(intn) {

} intmax(inttable[]) { } voidselectsort(inttable[]) { }}classArray1_ex{ publicstaticvoidmain(Stringargs[]){ }}3.2类的封装性类及其成员的访问权限访问权限填空举例:一个源程序文件Date1.java()classDate1{

()intyear,month,day;

()voidsetYear(){

()inty; this.year=y; }}()classDate1_ex{ publicstaticvoidmain(Stringargs[]){ }}答案:(public)classDate1{ (public)intyear,month,day; (private) (protected) (public)voidsetYear(){ ()inty; this.year=y; }}()classDate1_ex{ publicstaticvoidmain(Stringargs[]){ }}实例成员与类成员

static

在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。若无static修饰,则是实例方法和实例变量。类变量在各实例间共享classABCD{chardata;

staticintshare_data;}classDemo{ABCDa,b,c,d;}objectachardataobjectcchardataObjectbchardatastaticintshare_dataobjectdchardata3.2类的封装性3.2类的封装性实例成员与类成员实例成员变量与类成员变量两者声明时的差别 使用static声明的为类成员变量,没有使用static声明的为实例成员变量publicclassPerson1{Stringname;//姓名,实例成员变量

intage; //年龄,实例成员变量

staticintcount;//人数,类成员变量}类变量的生存期不依赖于对象,相当于C语言中全局变量的作用。其它类可以不用通过创建该类的实例,直接通过类名访问它们。3.2类的封装性实例成员与类成员实例成员变量与类成员变量两者存储结构的差别:1个和多个创建一个对象时,系统会为每一个对象的每一个实例成员变量分配一个存储单元;而为每一个类成员变量只分配一个存储单元,所有对象共用一个类成员变量。Person1p1=newPerson1(“李大明”,21);Person1p2=newPerson1(“王大伟”,19);图3.4实例成员变量与类成员变量的存储结构不同3.2类的封装性实例成员与类成员实例成员变量与类成员变量两者引用方式的差别:对象和类实例成员变量属于对象,必须通过对象访问;类成员变量属于类,既可以通过对象,也可以通过类访问。; //通过对象访问实例成员变量p1.count; //通过对象访问类成员变量Person1.count //通过类访问类成员变量3.2类的封装性实例成员与类成员实例成员方法与类成员方法两者声明时的差别

声明方法时,使用static声明的为类成员方法,没有使用static声明的为实例成员方法:publicstaticinthowMany() //类成员方法{returncount;//类成员方法只能访问类成员变量}类方法则相当于C语言中的全局函数,其他的类可以直接通过类名来访问类方法。(Java程序的入口方法main()就是一个类方法)?如何修改?实例成员与类成员实例成员方法与类成员方法两者方法体中语句的差别类成员方法只能访问类成员变量;实例成员方法既可以访问类成员变量,也可以访问实例成员变量;在类成员方法体中,不能使用this引用。例:publicclassStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){

System.out.println(mystring);}}3.2类的封装性解决办法1:将变量改成类变量publicclassNoStaticError{

staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}解决的办法2:先创建一个类的实例publicclassNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){NoStaticErrornoError=newNoStaticError();System.out.println(noError.mystring);}}StaticError.java:6:无法从静态上下文中引用非静态变量mystringSystem.out.println(mystring);//错误^3.2类的封装性实例成员与类成员实例成员方法与类成员方法两者调用方式的差别实例成员方法只能通过对象调用;类成员方法通过类调用,也可以通过对象调用Person1.howMany();//通过类名调用类成员方法p1.howMany();//通过对象调用类成员方法阅读P83,【例3.3】第3章面向对象的核心特性3.1类和对象3.2类的封装性3.3类的继承性3.4类的多态性3.5抽象类和最终类3.3类的继承性什么是继承继承性是面向对象的核心特征之二,是实现软件可重用性的最重要手段。继承的概念由一个已有的类定义一个新类,称为新类继承已有的类。图3.5类的继承性注:子类自动拥有父类的全部成员,包括成员变量和方法,使父类成员得以传承和延续;子类可以更改父类成员,使父类成员适应新的需求;子类可以增加自己的成员,使类的功能得以扩充;子类不能删除父类成员。3.3类的继承性什么是继承继承的作用单重继承方式下,父类和子类是一对多的关系。通常将通用性的功能设计在祖先类中,将特殊性的功能设计在后代类中。继承原则子类继承父类的成员变量,包括实例成员变量和类成员变量。子类继承父类除构造方法以外的成员方法,包括实例成员方法和类成员方法。子类不能继承父类的构造方法。因为父类构造方法创建的是父类对象,子类必须声明自己的构造方法,创建子类自己的对象。子类能够继承父类的析构方法。子类不能删除父类成员。子类可以增加自己的成员变量和成员方法。子类可以重定义父类成员。何时选择继承?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类。常犯的错误:A有一个B吗?例如让汽车轮子成为汽车的子类是错误的3.3类的继承性3.3类的继承性定义继承的类声明继承的类[修饰符]class类<泛型>[extends

父类][implements接口列表]publicclassStudent1extendsPerson1

{Stringspeciality; //专业}publicclassTeacher1extendsPerson1{ Stringdepartment; //系别}根据继承原则,Student1和Teacher1继承了父类Person1的变量name、age和方法;同时又增加了自己的变量。Java只支持单重继承方式,即一个类只能有一个父类。3.3类的继承性定义继承的类Java中的类都是Object的子类,因此不需要声明。publicclassPerson1extendsObject类的赋值相容性“即是”性质:子类对象即是父类对象,反之不成立Person1p1=newPerson1(“李小明”,21);Student1s1=newStudent1(“王大伟”,19);p1instanceofPerson1 //trues1instanceofPerson1 //true,子类对象即是父类对象p1instanceofStudent1 //false,父类对象不是子类对象父类对象能够被赋值为子类对象,反之不成立Person1p1=newStudent1(); //赋值相容,子类对象即是父类对象Student1s1=newPerson1(); //赋值不相容,父类对象不是子类对 象3.3类的继承性定义继承的类子类对象对父类成员的访问权限子类对父类的私有成员(private)没有访问权限;子类对父类的公有成员(public)和保护成员(protected)具有访问权限。子类对父类中缺省权限成员的访问分两种情况,对同一包中父类的缺省权限成员具有访问权限,而对不同包中父类的缺省权限成员则没有访问权限。子类重定义从父类继承来的成员子类重定义父类的同名成员变量,同名成员之间不会产生冲突和混乱。父类对象引用父类成员。子类对象引用子类成员。3.3类的继承性定义继承的类子类重定义从父类继承来的成员子类隐藏父类成员变量子类重定义父类的同名成员变量,则称子类隐藏了父类成员变量。子类覆盖父类成员方法子类重定义父类同名方法,参数列表完全相同时,称为覆盖。子类继承并重载父类成员方法子类重定义父类的同名方法,参数列表不同时,子类继承了父类的成员方法,并重载了继承来的该成员方法。即子类有两个重载的同名方法,参数列表不同。3.3类的继承性super引用在子类的成员方法中,可以用super引用父类成员。调用父类的构造方法子类不能继承父类的构造方法,但可以用super调用。super([参数列表])引用父类同名成员若存在重定义,则需使用super。子类隐藏父类成员变量super.成员变量子类覆盖父类成员方法super.成员方法([参数列表])重载时不需要,为什么?因为当重载时,能够通过调用时的实际参数相互区别,不存在歧义,因此重载时不需要用super。3.3类的继承性举例说明:publicclassStudent1extendsPerson1{ privateStringspeciality; //子类私有成员变量

publicStudent1(Stringname,intage,Stringspec) {//子类构造方法

super(name,age); //调用父类的构造方法

speciality=spec; } publicstaticvoidmain(Stringargs[]) { Person1p1=newPerson1("李小明",21); Student1s1=newStudent1(“王大伟”,10,“计算机”);System.out.println(+“比”++“大”+p1.olderThen(s1)+“岁”); //通过对象调用父类的方法

s1=null; Person1.howMany(); //调用父类的类成员方法

}}第7周回顾对象、类的概念客观世界的对象是物理实体类是对客观对象的抽象:状态→变量,行为→方法;定义类:[修饰符]class类<泛型>[extends父类][implements接口列表]类对象=new类的构造方法([参数列表]);类的封装性构造方法和析构方法访问权限:public,protected,private类的继承性[修饰符]class类<泛型>[extends

父类]单重继承,super第3章面向对象的核心特性3.1类和对象3.2类的封装性3.3类的继承性3.4类的多态性3.5抽象类和最终类3.4类的多态性什么是多态多态性是面向对象的核心特征之三,提供类中方法设计的灵活性和执行的多样性。多态性是指一个方法可以有多种实现版本,即“一种定义,多种实现”。方法的多态性主要有方法的重载和方法的覆盖。方法的重载重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。方法的覆盖覆盖(override)是指子类声明并实现父类中的同名方法并且参数列表也完全相同。Java执行方法的原则:从对象所属的类开始,寻找匹配的方法执行;如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类寻找匹配的方法,直到Object类。3.4类的多态性什么是多态举例判断:覆盖?重载?3.4类的多态性运行时多态性多态性有两种:编译时多态性和运行时多态性。对于多个同名方法,如果在编译时能确定执行同名方法中的哪一个,称为编译时多态性,否则为运行时多态性。方法的重载都是编译时多态性方法的覆盖表现出两种多态性:编译时多态性:对象获得本类实例Person1p1=newPerson1(“李小明”,21);//对象获得本类的实例, 对象与其获得的实例类型一致Student1s1=newStudent2("王大伟",19);p1.print(); //编译时多态性,执行Person1类的方法s1.print(); //编译时多态性,执行Student2类的方法3.4类的多态性运行时多态性运行时多态性:父类对象获得子类的实例Person1p2=newStudent2();//p2获得子类对象,对象 与其获得的实例类型不一致p2.print(); //运行时多态,执行Student2类覆盖的方法此时,父类对象只能执行那些在父类中声明、子类覆盖的子类方法。如:p2.set(“胡东东”,20);//正确,调用Person1类的set()方法p2.set(“胡东东”,20,“计算机”) //编译错,Person1类没有该方法3.5类的抽象性3.5类的抽象性抽象类(abstract)声明抽象类与抽象方法关键字:abstractpublicabstractclassClosedFigure//闭合图形抽象类{publicabstractdoublearea(); //计算面积,抽象方

法,分号";"必不可少

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论