第八章 多态

本章探讨了多态的概念,即动态绑定或运行时绑定。在构造器和多态的关系中,基类构造器在导出类构造过程中首先被调用,确保对象正确构造。接着按照声明顺序进行成员初始化,最后执行导出类构造器的主体。在初始化过程中,被覆盖的方法如`playMusic()`在基类构造器执行期间被调用,展示出多态的特性。当使用继承进行设计时,向上转型可能隐藏导出类的接口扩展,可通过向下转型来访问这些特定接口,但需要注意转型失败可能引发ClassCastException异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态:也称动态绑定,后期绑定或者运行时绑定


8.3 构造器和多态

1.基类的构造器总是在导出类的构造过程中被调用的,并且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用,因为构造器具有一项特殊任务,检查对象是否被正确的构造,导出类只能访问它自己的成员,不能访问基类的成员(通常都是定义成private),只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化,因此,必须令所有的构造器都得到调用。

构造器的调用顺序:

1)调用基类构造器。

2)按照声明顺序调用成员的初始化。

3)调用导出类的构造器的主体。

初始化的实际过程:

public class Father{
	public Father() {
		System.out.println("父亲的构造方法");
		playMusic();
		System.out.println("父亲的构造结束");
	}
public void playMusic(){
	 System.out.println("我是父类,我在放音乐!");
	}
	
}
public class Child extends Father{
	
	private int i=2;
	public Child() {
		System.out.println("孩子的构造方法,i="+i);
	}
	public void playMusic(){
		System.out.println("我是子类,我在放音乐!i="+i);
		} 
}
输出:

父亲的构造方法
我是子类,我在放音乐!i=0
父亲的构造结束
孩子的构造方法,i=2


通过以上分析可以得出:

1)在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。

2)如前所述那样调用基类构造器,此时,调用被覆盖后的playMusic()方法,并且调用该方法是在调用Child()构造器之前调用的,由于基类的构造器还没有执行完,此时执行被覆盖后的playMusic()方法输出i的值时,为默认的初始值。

3)按照声明的顺序调用成员的初始化。

4)调用导出类的构造器的主体。

8.5 用继承进行设计

当导出类有额外的接口时,当向上转型后,导出类中接口的扩展部分就不能被基类访问,想要访问可以通过向下转型。告知是要具体转型到哪个导出类,转型失败会抛出ClassCastException异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值