第四章继承和多态

上传人:壹****1 文档编号:569482899 上传时间:2024-07-29 格式:PPT 页数:21 大小:180.01KB
返回 下载 相关 举报
第四章继承和多态_第1页
第1页 / 共21页
第四章继承和多态_第2页
第2页 / 共21页
第四章继承和多态_第3页
第3页 / 共21页
第四章继承和多态_第4页
第4页 / 共21页
第四章继承和多态_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《第四章继承和多态》由会员分享,可在线阅读,更多相关《第四章继承和多态(21页珍藏版)》请在金锄头文库上搜索。

1、第第四章四章 继承和多态继承和多态继承和多态继承和多态n4.1继承基础继承基础n4.2构造器的调用顺序构造器的调用顺序n4.3 继承还是组合?继承还是组合?n4.4 Object类类n4.5 toString方法方法n4.6 对象的比较对象的比较4.1继承基础继承基础n类与类之间还有一种父与子的关系,子类继承父类方法与属性,这个我们就称之为继承 n子类拥有父类的一些公有的属性和方法,并且子类可能也会有自己的方法和属性 n除了添加父类中没有的新方法外子类还可以通过重写父类的方法来重定义自己的行为方式 继承基础继承基础n重写与重载不同,重载需要不同的参数来区别相同方法名的方法,重写是发生在子类与父

2、类上,重写父类方法必须与父类的方法名同名同参并且同返回值 。n当访问修饰符为private时,表明该方法不能被重写,同样当方法具有final关键字时该方法不能被重写 。n子类虽然重写了父类的某个方法,但仍然需要用到父类的这个方法,这时使用super关键字仍然可以调用父类的方法 。程序4.1 TestExtends.java示例继承机制程序4.2 TestOstrich.javapublic class TestOstrich public static void main(String args) Bird ostrich1 =new Ostrich(); /向上转型 ostrich1.fly

3、(); class Bird public static void fly()System.out.println(Bird Flying!);class Ostrich extends Birdpublic static void fly()System.out.println(I cant fly!);输出结果:Bird Flying!StaticStatic方法不能重写方法不能重写nBird类派生了鸵鸟Ostrich类 ,以上程序声明了一个Bird类型的鸵鸟对象,象基本类型数据的自动提升一样,鸵鸟自动提升为Bird类,这叫做向上转型。 nstatic方法是不会被重写n如TestOstri

4、ch.java所示:子类中定义了与父类同名的fly方法,父类的fly方法不会被重写,而是被遮蔽因此得出结果鸵鸟会飞! 4.2构造器的构造器的调用顺序调用顺序n子类在产生对象实例时首先会调用父类的构造方法,如果没有显示的指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法:super()。但是父类如果自定义了带参数的构造方法,就必须在子类的构造方法中指定调用它,否则会因找不到super()而报错。注意,如果需要显示的调用父类构造方法,必须将其写在构造方法里的第一行 。n接着按声明的顺序调用成员初始化。n最后调用本构造方法的方法体 例:程序4.3 TestInheritanceCons

5、tructor.java4.3 继承还是组合?继承还是组合?n判断继承关系的一条定律是看它是否符合is-a的定义 n继承打破了类的封装子类继承了父类的成员就意味着父类成员有所改变时子类必须随之变化,这削弱了子类的独立性,增加了软件维护的难度。n继承的层次不宜过多,设计时良好的继承体系应该保持在三层以内。n我们复用类时的指导原则是优先选择组合 例子:程序4.4 CallOffNumbers.java4.4 Object4.4 Object类类nJava中所有的类都是继承自一个老祖宗,Object类,它们都是Object类的子类。如果一个类在声明时没有用extends关键字显式的指定继承自某个基类

6、,则Java隐式的指定它的默认基类为Object类。n这种强制的继承模式叫做单根继承模式。单根继承使得Java简化了许多操作,基于单根继承,所有的对象都可以像基本数据类型一样向上转型到根层次上而使其操作上一视同仁 n单根继承的优势还在于可以在Object类定义所有对象都通用的方法,所有类都会自动继承这些方法 4.5 toString4.5 toString方法方法nObject类定义了 public String toString()方法,返回值是String类型,每当个对象都会有个toString方法,作用就是描述对象的信息n要想使用toString方法必须按自己的需求重写这个方法 例子:程

7、序4.6 TestToString.java4.6 4.6 对象的比较对象的比较nJava中比较两个基本数据类型变量的值时很简单使用“=”操作符 nObject类中的equals方法提供了对象内容的比较方法n同样我们要是用这个方法必须重写它 n如果不重写equals方法,将调用object类的eaquals方法。Object类的equals方法相当于“=”例:程序4.7 TestEquals.java4.7多态n4.7.1向上转型(upcasting)n4.7.2动态绑定n4.7.3构造器中多态方法的行为n4.7.4向下转型4.74.7多态多态n多态是和继承密切相关的,正因为有继承,才会有多态

8、出现。多态从字面上的意思应该是多种形态。更进一步,延伸到继承里来,那么多态就应该是具有相同的操作不同的行为的一种特征。4.7.14.7.1向上转型(向上转型(upcastingupcasting)publicclassShape voiddraw() staticvoidstart(Shapes) s.draw(); publicstaticvoidmain(Stringagrs) start(newCircle(); start(newSquare(); classCircleextendsShape voiddraw()System.out.println(“drawCircle”); c

9、lassSquareextendsShape voiddraw()System.out.println(“drawSquare”); 4.7.14.7.1向上转型(向上转型(upcastingupcasting)n在start()方法中,通过传入的参数类型不同,表现出来的行为也会不同。但是传入后的参数都统一转型为Shape这个基类型,这里就表现为向上转型。 n由导出类到基类,从继承图上面我们可以看出是向上移动的,因此我们一般称之为“向上转型”。n向上转型是从一个较具体的类型转换为一个较抽象的类型的过程,所以说是安全的。在导出类中至少包含了基类的方法。在向上转型的过程中,由于在导出类中可能含有基

10、类中没有的方法。类接口会丢失一些方法 4.7.24.7.2动态动态绑定绑定n将一个方法调用同一个方法主体关联起来被称之为绑定,若在程序执行前绑定就被称为前期绑定。 n后期绑定也被称为动态绑定,编译器始终都不会知道对象的类型,只有当方法在运行期间被调用时方法的调用机制就能找到正确的方法体。4.7.34.7.3构造器中多态方法的行为构造器中多态方法的行为publicclassShape3 Shape3() System.out.println(“thisisashape”); draw(); voiddraw() publicstaticvoidmain(Stringagrs) Shape3cir

11、cle=newCircle(); classCircleextendsShape3 inti=100; Circle() draw(); voiddraw()System.out.println(“drawCircle”+i); 最后的输出结果是:this is a shapedraw Circle0draw Circle100 不是我们希望的结果。4.7.34.7.3构造器中多态方法的行为构造器中多态方法的行为nI、在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。nII、如前所述的那样调用基类构造器。因此我们会发现,虽然在基类的构造器中调用了其子类的draw方法,而里面的i

12、值还并没有被初始化,但由于步骤1的原因,i的值被置为0。nIII、按照声明顺序调用成员的初始化方法。nIV、调用子类的构造器主体。4.7.44.7.4向下转型向下转型n由于向上转型会丢失一些具体的类型的信息,因此我们考虑用向下转型的方式,也就是和向下转型相反的方向转型。 4.7.44.7.4向下转型向下转型class A public void f() ; public void g() ; class B extends A public void f() ; public void g() ; public void h() ; class C extends A public void

13、f() ; public void g() ; public void u() ;class D extends A public void f() ; public void g() ; public class testRtti public static void main(String args) A a1 = new A(); A a2 = new B(); A a3 = new C(); a1.f(); a2.g(); a3.g(); /a2.h(); (B)a2.h();/向下转型 (C)a2.h();/异常 4.7.44.7.4向下转型向下转型n类B、类C和类D有共同的父类 。n类D和基类A看作是一种纯粹的“is-a”的关系 。n类B和类C中我们对基类进行了扩展,类B、C和A是is-like-a的关系。将他们向上转型后,他们特有的方法和属性就会丢失,如果需要找回这些属性和方法我们就需要进行强制的类型转换。n使用(B)a2.h()这样的方式来强制转换成B这个类型 ,会抛出ClassCastException 。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号