版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章接口、继承和多态8.1接口的使用8.2类的继承8.3多态8.4Object类8.5对象类型的转换8.6instanceof判断对象类型主要内容8.2类的继承8.2.1继承的实现8.2.2继承中的重写8.2.3使用super关键字8.2.1继承的实现继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。Java中只允许每个子类拥有一个直接父类,即单继承。在Java语言中,继承通过关键字extends来实现。即在子类的声明中,通过使用关键字extends来显式的指明其父类。8.2.1继承的实现其基本的语法格式如下:[修饰符]class子类名extends父类名{类体}public
classHusband{
protectedStringname;
protected
intage;
protectedStringsex;privateWifewife;}public
classWife{
protectedStringname;
protected
intage;
protectedStringsex;privateHusbandhusband;}public
classPerson{
protectedStringname;
protected
intage;
protectedStringsex;}public
classHusband{privateWifewife;}public
classWife{privateHusbandhusband;}子类可以继承父类的所有非私有成员变量和成员方法。8.2.1继承的实现【例8-3】创建Bird类,定义一个成员变量描述颜色。创建Pigeon类,它继承了Bird类。在构造方法中,对继承的color变量赋值。publicclassBird{Stringcolor;}publicclassPigeonextendsBird{publicPigeon(){color="White";}}8.2.1继承的实现成员的继承子类可以自行声明新的成员变量子类可以声明新的成员方法子类可以声明与父类具有相同签名的成员方法,即方法的重写。子类可以声明与父类中同名方法的重载方法。8.2.2继承中的重写重写是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,此时,称为子类的方法重写了父类的方法。重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。classA{
publicvoidf(){
System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf1(){//增加新的成员方法
System.out.println("thisissubclass!");}
publicstaticvoidmain(String[]args){
myappa=newmyapp();
a.f();
}}classA{
publicvoidf(){
System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf(){//方法的重写
System.out.println("thisissubclass!");}
publicstaticvoidmain(String[]args){
myappa=newmyapp();
a.f();
}}classA{
publicvoidf(){
System.out.println("thisisfatherclass!");}}publicclassmyappextendsA{publicvoidf(String
str){//方法的重载
System.out.println("thisissubclass!"+str);}
publicstaticvoidmain(String[]args){
myappa=newmyapp();
a.f("abc");
}}8.2.3使用super关键字子类可以继承父类的非私有成员变量和成员方法。但若子类中声明的成员变量与父类的成员变量同名,则子类的成员变量隐藏了父类的成员变量。若子类中声明的成员方法与父类的成员方法同名,并且方法的返回值类型、参数个数和类型也完全相同,则子类的成员方法重写了父类的成员方法。8.2.3使用super关键字若想在子类中访问父类中被隐藏的成员变量和被重写的成员方法,可以使用super关键字来操作。super关键字主要有以下两种用途。1.调用父类的构造方法若要创建子类对象时希望对从父类继承的成员变量初始化,需在子类的构造方法中利用super调用父类的构造方法。8.2.3使用super关键字1.调用父类的构造方法构造格式:super([参数列表]);利用super调用父类构造方法的语句必须作为子类构造方法中的第一条语句。若第一条语句不是调用父类构造方法的语句,系统会自动插入一条调用父类默认构造方法的语句,如果父类没有不带参数的构造方法,则会出现编译错误。publicclassCircle{private
intr;publicCircle(){r=0;}publicCircle(intr1){r=r1;}publicint
getR(){returnr;}}publicclassCylinderextendsCircle{int
x,y;publicCylinder(){super();x=0;y=0;} publicCylinder(intr1,intx1,inty1){
super(r1);x=x1;y=y1;}publicstaticvoidmain(String[]args){Cylindercy=newCylinder();Cylindercy2=newCylinder(1,2,3);
System.out.println(cy);System.out.println(cy2);}半径:0坐标:(0,0)半径:1坐标:(2,3)publicStringtoString(){return"半径:"+getR()+"坐标:("+x+","+y+")";}}8.2.3使用super关键字super关键字主要有以下两种用途。2.操作被隐藏的成员变量和被重写的成员方法具体格式:super.成员变量名super.成员方法名([参数列表])classFather{publicStringv="Father";publicStringx="Father类的成员变量x!!!";publicFather(){
System.out.println("Father构造方法被调用!");}publicvoidoutinfo(){
System.out.println("Father的outinfo方法被调用");}}publicclassSonextendsFather{publicStringv="Son";publicSon(){super();System.out.println("Son构造方法被调用!");}//覆盖了超类成员方法outinfo()publicvoidoutinfo(){
System.out.println("Son的outinfo()方法被调用");}public
voidtest(){Stringv="哈哈哈哈!";System.out.println("------1-----");System.out.println(v);System.out.println(this.v);System.out.println(super.v);System.out.println("------2-----");System.out.println(x);System.out.println(super.x);System.out.println("------3-----");outinfo();this.outinfo();super.outinfo();}public
static
void
main(String[]args){Sonson=newSon();son.test();}}8.3多态对于同一个消息,不同类的对象可以作出不同的反应被称为多态性。在Java中,通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态性。方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。8.3多态【例8-5】在项目中创建MaxNumber类,定义两个getMax()方法,分别用来比较int类型和double类型变量并获得最大值。publicclassMaxNumber{
publicstaticint
getMax(intnumber1,intnumber2){return(number1>number2?number1:number2);}
publicclassMaxNumber{
publicstaticint
getMax(…){…}publicstaticdoublegetMax(doublenumber1,doublenumber2){return(number1>number2?number1:number2);}publicstaticvoidmain(String[]args){
int
intMax=getMax(12,21);System.out.println("12和21最大值:"+intMax);doubledoubleMax=getMax(12.0,21.0);System.out.println("12.0和21.0最大值:"+doubleMax);}}8.3多态通过方法的重写实现多态是指一个给定类型的变量可以引用不同类型的对象,并且能够自动地调用变量所引用的对象类型的特定成员方法。在Java中,实现这种处理机制的方法是利用指向父类对象的引用指向其子类对象,并根据该引用所指的当前子类类型,选择执行哪一个子类中重写的成员方法。classBaseClass{publicvoidf(){System.out.println("father");}}classDeriveClass1extendsBaseClass{publicvoidf(){System.out.println("son1");}}classDeriveClass2extendsBaseClass{publicvoidf(){System.out.println("son2");}}publicclassmyapp{publicstaticvoidmain(String[]args){
BaseClass
bc[]=newBaseClass[3];bc[0]=newBaseClass();bc[0].f();bc[1]=newDeriveClass1();bc[1].f();bc[2]=newDeriveClass2();bc[2].f();
}}fatherson1son28.4Object类8.4.1getClass()方法8.4.2toString()方法8.4.3equals()方法8.4Object类在Java中,所有的类都直接或间接继承了java.lang.Object类。Object类是所有类的父类,是Java类层中最高层类,Java中任何一个类都是它的子类。当创建一个类时,总是在继承,除非某个类已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的,如String、Integer等类都是继承于Object类除此之外自定义的类也都继承于Object类8.4Object类由于所有类都是Object子类,所以在定义类时,省略了extendsObject关键字。8.4Object类Java将所有的类都作为Object类的子类。1)一个Object类型的对象可以用来引用任何类的对象。2)可以将成员方法的参数设置为Object类型,以方便方法能够接收参数传递进来的任何类型的对象。3)在Object类中提供了所有对象都应该有的行为方法,可以更好地统一这些成员方法的接口形式。8.4Object类1)getClass()方法getClass()方法是Object类的定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();可以将getClass()方法与toString()方法联合使用。8.4Object类2)toString()方法toString()方法的功能是将一个对象返回为字符串形式,返回一个String实例。在实际应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。在输出引用类型变量时,也会自动调用toString()方法。8.4Object类【例8-6】重写toString方法publicclassToStringDemo{@Override
publicStringtoString(){return"ToStringDemo类";
}publicstaticvoidmain(String[]args){
ToStringDemot=newToStringDemo();
System.out.println(t);
}}8.4Object类toString()方法重写的几点说明必须被声明为public返回类型为String方法的名称必须为toString,且没有参数在方法体中不要使用输出方法System.out.println()8.4Object类3)equals()方法“==”操作符可以用来比较两个基本类型的变量值是否相同,还可以比较两个引用是否指向同一个对象。Object类中定义的equals()方法,其默认实现也是比较两个引用是否指向同一个对象。这在实际开发中并无任何意义。因此通常需要重写该方法来比较实际内容是否相同。注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。8.4Object类【例8-7】在项目中创建EqualsDemo类,在主方法中使用“==”和equals()方法来比较内容相同的两个字符串对象。publicstaticvoidmain(String[]args){ Strings1=newString("mrsoft");
Strings2=newString("mrsoft");
System.out.println(s1+"和"+s2+"指向同一对象:"+(s1==s2));System.out.println(s1+"和"+s2+"内容相同:"+(s1.equals(s2)));}publicclassCircle{protectedintr;publicCircle(){r=0;}publicCircle(intr1){r=r1;}publicboolean
equals(Circles){if(s.r==r)returntrue;elsereturnfalse;}publicstaticvoidmain(String[]args){Circlec1=newCircle();Circlec2=newCircle(0);System.out.println(c1.equals(c2));
}}补充:装箱和拆箱在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型)。基本类型的数据不是对象,不能作为对象调用其toString()、hashCode()、getClass()、equals()等等方法。所以在java中,针对8种基本数据类型,提供了针对每个基本数据类型的包装类。INDEX基本数据类型包装类
1 int Integer
2 char Character
3 float
Float
4 double
Double
5 byte
Byte
6 short
Short
7 long
Long
8 boolean
Boolean补充:装箱和拆箱补充:装箱和拆箱所谓装箱,就是把基本类型用它们相应的引用类型包起来,使它们可以具有对象的特质把int型包装成Integer类的对象,把double包装成Double,等等。所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据。补充:装箱和拆箱//JDK1.5之前使用手动方式进行装箱和拆箱的操作publicclassIntegerDemo{
publicstaticvoidmain(String[]agrs){
inti=10;
Integerj=newInteger(i); //手动装箱操作
inti1=Value(); //手动拆箱操作
System.out.println(i1*i1);
}
}publicclassIntegerDemo02{
publicstaticvoidmain(String[]agrs){
inti=10
Integerj=i;
intk=j;
System.out.println(++k);
}
}补充:装箱和拆箱//JDK1.5之后可自动进行的装箱和拆箱的操作,比较方便8.5对象类型的转换8.5.1向上转型8.5.2向下转型8.5.1向上转型向上转型:将子类对象看做是父类的对象。向上转型是从一个较具体的类到较抽象的类之间的转换,总是安全的。8.5.1向上转型【例8-8】创建Parallelogram类,在类中创建Quadrangle类,并使Parallelogram类继承Quadrangle类,然后在主方法中调用父类的draw()方法。classQuadrangle{
publicstaticvoiddraw(Quadrangleq){
//SomeSentence}}publicclassParallelogramextendsQuadrangle{
publicstaticvoidmain(String
args[]){Parallelogramp=newParallelogram();
draw(p);
}}8.5.2向下转型向下转型是将较抽象类转换为较具体的类。子类对象总是父类的一个实例,但是父类对象不一定是子类的实例。因此在程序中使用向下转型技术时,必须使用显式类型转换,向编译器指明将父类对象转换为哪一种类型的子类对象。8.5.2向下转型【例8-9】修改例8-8,在Parallelogram类的主方法中将父类Quadrangle的对象赋值给子类Parallelogram的对象的引用变量将使程序产生错误。classQuadrangle{publicstaticvoiddraw(Quadrangleq){//SomeSentence}}publicclassParallelogramextendsQuadrangle{publicstaticvoidmain(String
args[]){
draw(newParallelogram());
Quadrangleq=newParallelogram();//Parallelogramp=q;
Parallelogramp=(Parallelogram)q;}}8.5.2向下转型如果将父类对象直接赋予子类,将会发生编译器错误,因为父类对象不一定是子类实例例如一个四边形不一定就是指平行四边形,也许它是梯形,也许是正方形,也许是其他带有四个边的不规则图形。8.5.2向下转型做向下转型操作时,将特性范围小的对象转换为特性范围大的对象肯定会出现问题,所以这时需要告知编译器这个四边形就是平行四边形,将父类对象强制转换为某个子类对象,这种方式称为显式类型转换8.1接口的使用8.1.1接口的定义8.1.2接口的实现8.1接口的使用可以把用于完成特定功能的若干属性(方法)组织成相对独立的属性(方法)集合,凡是需要实现这种特定功能的类,都可以继承这个集合,并在类内使用它,这种集合就是接口。8.1.1接口的定义使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成。定义接口的基本语法格式如下:[修饰符]interface接口名[extends父接口名列表]{[public][static][final]变量;[public][abstract]方法;}8.1.1接口的定义
表8-1定义接口的语法格式的参数说明
参数说明修饰符可选参数,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限接口名必选参数,用于指定接口名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写extends父接口列表可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数方法接口中的的方法只有定义而没有被实现8.1.1接口的定义接口的特点:与抽象类一样都是定义多个类的共同属性使抽象概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体也可以包含基本数据类型的数据成员,但它们都默认为static和final8.1.1接口的定义【例8-1】创建接口
publicinterfaceICircle{doublePI=3.14159;doublegetCircumference(doubleradius);doublegetArea(doubleradius);doublegetVolume(doubleradius);}8.1.2接口的实现因为接口中的属性都是常量,接口中的方法都是没有方法体的抽象方法。接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,而并没有真正实现这个功能,这个功能的真正实现是在“继承”这个接口的各个类中完成的,要由这些类来具体定义接口中各抽象方法的方法体。8.1.2接口的实现接口的应用:规定某些类应该实现的方法调用接口。通过定义一个能实现多个接口的类,模拟类的多重继承。接口在定义后,就可以在类中实现该接口。8.1.2接口的实现在类中实现接口可以使用关键字implements基本语法格式如下所示:[修饰符]class<类名>[extends父类名][implements接口列表]{}
在非抽象类中实现接口时,方法名、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。8.1.2接口的实现【例8-2】创建类实现接口publicclassCircleimplementsICircle
{@OverridepublicdoublegetCircumference(doubleradius){ return2*PI*radius;}
@OverridepublicdoublegetArea(doubleradius){ returnPI*radius*radius;}
@Override
publicdoublegetVolume(doubleradius){ return4*PI*radius*radius*radius/3.0;}}8.6instanceof判断对象类型当在程序中执行向下转型操作时,如果父类对象不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级下册数学教学工作计划进度安排
- 《研究生单招复习题》课件
- 《园林及植物配置》课件
- 艺术场馆经济效益评估-洞察分析
- 眼眶减压术研究-洞察分析
- 塑料原料供应风险应对-洞察分析
- 语义相似度度量模型-洞察分析
- 虚拟现实手术模拟-第2篇-洞察分析
- 隐私保护增强学习-洞察分析
- 虚拟环境下的保险理赔调查-洞察分析
- 承压设备事故及处理课件
- 煤层气现场监督工作要点
- 工会经费收支预算表
- 舒尔特方格55格200张提高专注力A4纸直接打印版
- 质量管理体系各条款的审核重点
- 聚丙烯化学品安全技术说明书(MSDS)
- BBC美丽中国英文字幕
- 卫生院工程施工组织设计方案
- CDR-临床痴呆评定量表
- 《八年级下学期语文教学个人工作总结》
- 铝合金门窗制作工艺卡片 - 修改
评论
0/150
提交评论