您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java面向对象程序设计第5章_继承与接口(2)
《Java面向对象程序设计》第5章继承与接口续主讲:王美丽办公室:信息学院204Email:meili_w@nwsuaf.edu.cn本次内容类的继承4123方法的多态性抽象类和最终类接口二、方法的多态性多态性:发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。java遵循原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。1.如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。2.如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。二、方法的多态性引用变量有两个类型编译时的类型运行时的类型由声明该变量时使用的类型决定由实际赋给该变量的对象决定如果编译时的类型和运行时类型不一致,就出现多态(Polymorphism)。Helloh=newTestHello();Helloh=newHello();二、方法的多态性classBaseClass{publicintbook=6;publicvoidbase(){System.out.println(父类的普通方法);}publicvoidtest(){System.out.println(父类的被覆盖的方法);}}publicclassSubClassextendsBaseClass{publicStringbook=轻量级J2EE企业应用实战;publicvoidtest(){System.out.println(子类的覆盖父类的方法);}publicvoidsub(){System.out.println(子类的普通方法);}publicstaticvoidmain(String[]args){BaseClassbc=newBaseClass();System.out.println(bc.book);bc.base();bc.test();SubClasssc=newSubClass();System.out.println(sc.book);sc.base();sc.test();sc.sub();BaseClassploymophicBc=newSubClass();System.out.println(ploymophicBc.book);ploymophicBc.base();ploymophicBc.test();}}编译时类型和运行时类型完全一样,不存在多态编译时类型和运行时类型完全一样,不存在多态编译时类型和运行时类型不一样,多态发生二、方法的多态性子类是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型(upcasting),向上转型由系统自动生成。当把一个子类对象直接赋给父类引用变量,运行时调用该引用变量的方法时,其方法行为总是像子类方法的行为,而不是像父类方法行为,这将出现相同类型的变量、执行同一个方法时呈现出不同的行为特征,这就是多态。返回主菜单二、方法的多态性记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。返回主菜单三、抽象类和最终类1、抽象类(1)classShape{publicStringcalPerimeter()//计算周长{/*各种形状计算周长的公式不同,此处如何书写?*/}}classTriangleextendsShape{publicStringcalPerimeter{//…}publicstaticvoidmain(String[]args){Shapet=newTriangle();}}如果去掉此方法,降低程序的灵活性使用抽象方法即可满足要求:只有方法签名,没有方法的具体实现。三、抽象类和最终类1、抽象类(2)publicabstractclassShape{{System.out.println(执行Shape的初始化块...);}privateStringcolor;publicabstractdoublecalPerimeter();publicabstractStringgetType();publicShape(){}publicShape(Stringcolor){System.out.println(执行Shape的构造器...);this.color=color;}publicvoidsetColor(Stringcolor){this.color=color;}publicStringgetColor(){returnthis.color;}}抽象类,用abstract修饰抽象方法,注意和空方法体的区别三、抽象类和最终类1、抽象类(3)使用规则抽象类必须使用abstract来定义,抽象方法也必须使用abstract来定义,抽象方法不能有方法体。抽象类不能被实例化,无法使用new调用构造器创建抽象类的实例,即使抽象类里不包含抽象方法。抽象类的构造器主要是用于被其子类调用。abstract不能用于修饰局部变量、属性、构造器。三、抽象类和最终类1、抽象类(4)publicclassTriangleextendsShape{privatedoublea,b,c;publicTriangle(Stringcolor,doublea,doubleb,doublec){super(color);this.setSides(a,b,c);}publicvoidsetSides(doublea,doubleb,doublec){if(a=b+c||b=a+c||c=a+b){System.out.println(三角形两边之和必须大于第三边);return;}this.a=a;this.b=b;this.c=c;}publicdoublecalPerimeter(){returna+b+c;}publicStringgetType(){returngetColor()+三角形;}}调用父类(抽象类)的构造函数重写父类的抽象方法三、抽象类和最终类1、抽象类(5)publicclassCircleextendsShape{publicdoubleradius;publicCircle(Stringcolor,doubleradius){super(color);this.radius=radius;}publicdoublecalPerimeter(){return2*Math.PI*radius;}publicStringgetType(){returngetColor()+圆形;}publicstaticvoidmain(String[]args){Shapes1=newTriangle(黑色,3,4,5);Shapes2=newCircle(黄色,3);System.out.println(s1.getType());System.out.println(s1.calPerimeter());System.out.println(s2.getType());System.out.println(s2.calPerimeter());}}调用父类(抽象类)的构造函数重写父类的抽象方法编译时类型和运行时类型不一样,多态发生利用抽象类和抽象方法的优势,可更好的发挥多态的优势,使程序更加灵活。三、抽象类和最终类1、抽象类(6)抽象:从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。抽象类体现的是一种模板模式的设计。三、抽象类和最终类2、最终类(1)不可改变①final变量表示该变量一旦获得了初始值之后就不可改变final修饰成员变量final修饰局部变量不可被重写,如果出于某些原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法②final方法三、抽象类和最终类2、最终类(2)•最终类是指不能被继承的类,即不能再用最终类派生子类。例如:publicfinalclassC•如果创建最终类似乎不必要,而又想保护类中的一些方法不被覆盖,可以用关键字final来指明那些不能被子类覆盖的方法,即最终方法。返回主菜单③final类finaldata返回classValue{inti=1;}publicclassFinaldata{finalinti1=9;staticfinalinti2=99;publicstaticfinalinti3=999;finalinti4=(int)(Math.random()*20);staticfinalinti5=(int)(Math.random()*20);Valuev1=newValue();finalValuev2=newValue();staticfinalValuev3=newValue();finalint[]a={1,2,3,4,5};publicstaticvoidmain(String[]args){finaldoubled;d=5.6;d=3.4;}}finalmethod返回publicclassFinalMethod{}classSubextendsFinalMethod{publicvoidtest(){}}出现编译错误,不能重写final方法publicfinalvoidtest(){}privatefinalvoidtest(){}不是重写父类的方法,没问题!publicclassFinalOverload{publicfinalvoidtest(){}publicfinalvoidtest(Strings){}}final方法只是不能被重写,完全可以被重载!四、接口•接口(interface):–更彻底的抽象(totallyabstractclass)–不能包含普通方法,而全部都是抽象方法1、概念(1)1、概念(2)接口层次类层次对象层次PCI接口规范A型号PCI实现B型号PCI实现实现实现实例化A型号的PCI插槽1实例化A型号的PCI插槽2B型号的PCI插槽1B型号的PCI插槽2实例化实例化让规范和实现分离正是接口的好处。例:只要显卡遵循PCI接口规范,就可以插入PCI插槽,主机板无须关心显卡内部如何实现的、是哪个厂家的产品等细节。四、接口接口的定义格式为:〈修饰符〉interface〈接口名〉extends父接口1,父接口2…2、定义(1)只能是public或者省略和类名的命名规则相同一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类由于接口只是规范,所以接口里不能包括构造器、初始化块。四、接口接口中的成员变量全部隐含为publicfinalstatic型,所有方法都是public的,即使没有声明。接口中定义的所有成员变量都必须设置初值2、定义(2)四、接口接口的定义publicinterfaceOutput{intMax_CACHE_LINE=50;voidout();voidgetData(Stringmsg);}•接口里定义的属性只能是常量•相当publicstaticfinalint3、接口的继承接口支持多继承,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法、常量属性等。一个Java源文件里最多只能有一个public接口,如果一个Java源文件里定义了一个public接口,则该源文件的主文件名必须与该接口名相同。四、接口接口的继承interfaceinterfaceA{intPROP_A=5;voidtestA();}interfaceinterfaceB{intPROP_B=6;voidtestB();}interfaceinterfa
本文标题:Java面向对象程序设计第5章_继承与接口(2)
链接地址:https://www.777doc.com/doc-3355011 .html