




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java面向对象程序设计 第5章继承与接口续 主讲:王美丽主讲:王美丽办公室:信息学院204 Email: meili_本次内容本次内容类的继承类的继承4123方法的多态性方法的多态性抽象类和最终类抽象类和最终类接口接口二、方法的多态性多态性:发送消息给某个对象,让该对象自行决定响应何种行为 。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 。java 遵循原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法 。1. 如果a是类A的一个引用,那么,a可以指向类A的一个
2、实例,或者说指向类A的一个子类 。2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例 。二、方法的多态性引用变量有两个类型编译时的类型运行时的类型由声明该变量时使用的类型决定由实际赋给该变量的对象决定如果编译时的类型和运行时类型不一致,就如果编译时的类型和运行时类型不一致,就出现多态(出现多态(PolymorphismPolymorphism)。)。Hello h=new TestHello();Hello h=new Hello();二、方法的多态性public class SubClass extends BaseClasspublic String book =
3、轻量级轻量级J2EE企业应用实战企业应用实战;public void test() System.out.println(子类的覆盖父类的方法子类的覆盖父类的方法);public void sub()System.out.println(子类的普通方法子类的普通方法);public static void main(String args)BaseClass bc = new BaseClass();System.out.println(bc.book);bc.base();bc.test();SubClass sc = new SubClass();System.out.println(sc
4、.book);sc.base();sc.test();sc.sub();BaseClass ploymophicBc = new SubClass();System.out.println(ploymophicBc.book);ploymophicBc.base();ploymophicBc.test();编译时类型和运行时编译时类型和运行时类型完全一样,不存类型完全一样,不存在多态在多态编译时类型和运行时编译时类型和运行时类型完全一样,不存类型完全一样,不存在多态在多态编译时类型和运行时类型编译时类型和运行时类型不一样,多态发生不一样,多态发生二、方法的多态性子类是一种特殊的父类,因此子类是
5、一种特殊的父类,因此JavaJava允许把一个子类允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型(换,或者被称为向上转型(upcastingupcasting), ,向上转型向上转型由系统自动生成。由系统自动生成。当把一个子类对象直接赋给父类引用变量,运行时当把一个子类对象直接赋给父类引用变量,运行时调用该引用变量的方法时,其方法行为总是像子类调用该引用变量的方法时,其方法行为总是像子类方法的行为,而不是像父类方法行为,这将出现相方法的行为,而不是像父类方法行为,这将出现相同类型的变量、执行同一个方法时呈现出不同的行
6、同类型的变量、执行同一个方法时呈现出不同的行为特征,这就是多态。为特征,这就是多态。二、方法的多态性记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。 你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。 三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(1)(1)class Shapepublic String calPerimeter()/计算周长计算周长/*各种形状计算周长的公式不同,各
7、种形状计算周长的公式不同,此处如何书写?此处如何书写?*/class Triangle extends Shape public String calPerimeter /public static void main(String args)Shape t=new Triangle();如果去掉此方法,降低程序的灵活性使用抽象方法即可满足要求:只有方法签名,使用抽象方法即可满足要求:只有方法签名,没有方法的具体实现。没有方法的具体实现。三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(2)(2)public abstract class ShapeSystem.out.printl
8、n(执行执行Shape的初始化块的初始化块.);private String color;public abstract double calPerimeter(); public abstract String getType();public Shape()public Shape(String color)System.out.println(执行执行Shape的构造器的构造器.);this.color = color; public void setColor(String color)this.color = color; public String getColor() retur
9、n this.color; 抽象类,用abstract修饰抽象方法,注意和空方法体的区别三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(3)(3)使用规则抽象类必须使用抽象类必须使用abstractabstract来定义,抽象方法也必须使用来定义,抽象方法也必须使用abstractabstract来定义,抽象方法不能有方法体。来定义,抽象方法不能有方法体。抽象类不能被实例化,无法使用抽象类不能被实例化,无法使用newnew调用构造器调用构造器创建抽象类的实例,即使抽象类里不包含抽象方创建抽象类的实例,即使抽象类里不包含抽象方法。法。抽象类的构造器主要是用于被其子类调用。抽象类的构造
10、器主要是用于被其子类调用。abstractabstract不能用于修饰局部变量、属性、构造器。不能用于修饰局部变量、属性、构造器。三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(4)(4)public class Triangle extends Shape private double a,b,c; public Triangle(String color , double a , double b , double c) super(color); this.setSides(a , b , c); public void setSides(double a , double
11、b , double c) if (a = b + c | b = a + c | c = a + b) System.out.println(三角形两边之和必须大于第三边三角形两边之和必须大于第三边);return; this.a = a; this.b = b; this.c = c; public double calPerimeter() return a + b + c; public String getType() return getColor() + 三角形三角形;调用父类(抽象类)的构造函数重写父类的抽象方法三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(5)(
12、5)public class Circle extends Shapepublic double radius;public Circle(String color , double radius) super(color);this.radius = radius; public double calPerimeter() return 2 * Math.PI * radius;public String getType()return getColor() + 圆形圆形;public static void main(String args)Shape s1 = new Triangle(
13、黑色黑色 , 3 , 4, 5);Shape s2 = new Circle(黄色黄色 , 3);System.out.println(s1.getType();System.out.println(s1.calPerimeter();System.out.println(s2.getType();System.out.println(s2.calPerimeter();调用父类(抽象类)的构造函数重写父类的抽象方法编译时类型和运编译时类型和运行时类型不一样,行时类型不一样,多态发生多态发生利用抽象类和抽象方法的优势,可更好的发挥多利用抽象类和抽象方法的优势,可更好的发挥多态的优势,使程序更加
14、灵活。态的优势,使程序更加灵活。三、抽象类和最终类三、抽象类和最终类1 1、抽象类、抽象类(6)(6)抽象:从多个具有相同特征的类中抽象出一个抽抽象:从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。免了子类设计的随意性。抽象类体现的是一种模板模式的设计。抽象类体现的是一种模板模式的设计。三、抽象类和最终类三、抽象类和最终类2 2、最终类、最终类(1)(1)不可改变final变量表示该变量一旦获得了初始值之后就不可改变final修饰成员变量final修饰局部变量不可被重写,如果出于某些原因,不希望子类重
15、写父类的某个方法,则可以使用final修饰该方法final方法三、抽象类和最终类三、抽象类和最终类2 2、最终类、最终类(2)(2)最终类最终类是指不能被继承的类,即不能再是指不能被继承的类,即不能再用最终类派生子类。例如:用最终类派生子类。例如:public final class C如果创建最终类似乎不必要,而又想保如果创建最终类似乎不必要,而又想保护类中的一些方法不被覆盖,可以用关护类中的一些方法不被覆盖,可以用关键字键字final来指明那些不能被子类覆盖的来指明那些不能被子类覆盖的方法,即方法,即最终方法最终方法。final类finaldataclass Valueint i=1; p
16、ublic class Finaldatafinal int i1=9;static final int i2=99;public static final int i3=999;final int i4=(int)(Math.random()*20);static final int i5=(int)(Math.random()*20);Value v1=new Value();final Value v2=new Value();static final Value v3=new Value();final int a=1,2,3,4,5;public static void main(S
17、tring args)final double d;d=5.6;d=3.4;finalmethodpublic class FinalMethodclass Sub extends FinalMethodpublic void test()出现编译错误,不能重写final方法public final void test()private final void test()不是重写父类的方法,没问题!public class FinalOverloadpublic final void test()public final void test(String s)final方法只是不能被重写,完全
18、可以被重载!四、接口四、接口 接口接口(interface): 更彻底的抽象(更彻底的抽象(totally abstract class) 不能包含普通方法,而全部都是抽象方法不能包含普通方法,而全部都是抽象方法1 1、概念、概念(1)(1)1 1、概念、概念(2)(2)接口层次类层次对象层次PCIPCI接口规范接口规范A A型号型号PCIPCI实现实现B B型号型号PCIPCI实现实现实现实现实例化A A型号的型号的PCIPCI插槽插槽1 1实例化A A型号的型号的PCIPCI插槽插槽2 2B B型号的型号的PCIPCI插槽插槽1 1B B型号的型号的PCIPCI插槽插槽2 2实例化实例化让
19、规范和实现分离正是接口的好处。让规范和实现分离正是接口的好处。例:只要显卡遵循例:只要显卡遵循PCIPCI接口规范,就可以插入接口规范,就可以插入PCIPCI插槽,插槽,主机板无须关心显卡内部如何实现的、是哪个厂家的主机板无须关心显卡内部如何实现的、是哪个厂家的产品等细节。产品等细节。四、接口四、接口接口的定义格式为:修饰符interface接口名extends 父接口1,父接口22 2、定义、定义(1)(1)只能是只能是publicpublic或或者省略者省略和类名的命名规则相同和类名的命名规则相同一个接口可以有多个直接父接口,一个接口可以有多个直接父接口,但接口只能继承接口,不能继承但接口
20、只能继承接口,不能继承类类由于接口只是规范,所以接口里不能包括构造器、初由于接口只是规范,所以接口里不能包括构造器、初始化块。始化块。四、接口四、接口接口中的成员变量全部隐含为接口中的成员变量全部隐含为public final staticpublic final static型型, , 所有方法都是所有方法都是publicpublic的,即使没有声明。的,即使没有声明。接口中定义的所有成员变量都必须设置初值接口中定义的所有成员变量都必须设置初值2 2、定义、定义(2)(2)四、接口四、接口接口的定义接口的定义public interface Outputint Max_CACHE_LINE=
21、50;void out();void getData(String msg); 接口里定义的属性只能是常量接口里定义的属性只能是常量相当相当public static final intpublic static final int3 3、接口的继承、接口的继承接口支持多继承,子接口扩展某个父接口,将会获得接口支持多继承,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法、常量属性等。父接口里定义的所有抽象方法、常量属性等。一个一个JavaJava源文件里最多只能有一个源文件里最多只能有一个publicpublic接口,如果接口,如果一个一个JavaJava源文件里定义了一个源文件里定义
22、了一个publicpublic接口,则该源文接口,则该源文件的主文件名必须与该接口名相同。件的主文件名必须与该接口名相同。四、接口四、接口接口的继承接口的继承interface interfaceA int PROP_A = 5;void testA();interface interfaceBint PROP_B = 6;void testB();interface interfaceC extends interfaceA, interfaceBint PROP_C = 7;void testC();public class TestInterfaceExtends public static void main(String args)System.out.println(interfaceC.PROP_A);System.out.println(interfaceC.PROP_B);System.out.println(interfaceC.PROP_C);4 4、使用接口、使用接口(1)(1)定义类时实现接口用关键字定义类时实现接口用关键字implementsimp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年物流经理中级面试实战指南与题库
- 2025年商业综合体精装修材料供应及施工总承包合同
- 2025年绿色环保酒店餐饮服务合同标准范本
- 2025年度腾讯QQ游戏平台软件授权与运营服务全面升级合同
- 2025年医药连锁企业药品销售员劳动合同与顾客满意度提升服务合同
- 2025年度跨境电商物流APP定制开发及全球供应链整合服务合同
- 2025年企业展会活动场地租赁及全程管理服务合同
- 2025年度租赁车辆深度保养与性能提升服务合同
- 2025年度金融数据信息库共享许可与数据安全保护协议
- 2025年绿色环保高新技术企业质押贷款合同促进产业转型升级
- 教师职业技能提升培训教程
- 2025年版房屋租赁合同模板下载
- 2025年第三类医疗器械培训试卷(含答案)
- 2025年医院财务科招聘考试题目(附答案)
- 面试指导:空中乘务面试常见问题与答案
- 2025年医德医风培训试题(附参考答案)
- 二人合伙开店的合同协议
- 北师大版五年级数学下册常考题:分数除法(单元测试)含答案
- 2025年4月自考00840第二外语(日语)试题
- 2024年北京客运资格从业证考试内容
- 2021年秋期新人教版部编本六年级语文上册教材解读
评论
0/150
提交评论