Java学习笔记(十三):关于子类初始化的过程

子类继承父类,创建子类对象时,先调用父类的构造函数,再调用自己的构造函数,如果父类的构造函数中调用了一个方法,且方法被子类覆写,那么就会调用子类的覆写的方法

举例:

package constructor;

class A
{
	A()
	{
		draw();
		System.out.println("A is constructing");
		
	}
	void draw()
	{
		System.out.println("A is drawing!");
	}

}
public class B extends A
{
	private int m = 1;
	B(int m)
	{
		this.m = m;
		System.out.println("B is constructing! m = "+Integer.toString(m));
	}
	void draw()
	{
		System.out.println("B is drawing! m = "+Integer.toString(m));
	}
	public static void main(String[] args)
	{
		new B(10);
		//输出如下
		/*
		B is drawing! m = 0
		A is constructing
		B is constructing! m = 10 
		 */
	}
}
如上所示:

你会发现m的值第一次应该为1,却输出了0,那是因为构造对象时,对象的存储空间被初始化为二进制的0。

创建子类对象 B 时,初始化的实际过程如下

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

(2)调用父类的构造器,调用相应的方法draw,由于(1)的缘故,导致m = 0

(3)按类成员进行初始化,此时m = 1

(4)调用子类的构造器

因此,一般在构造器中调用final方法或private方法(private方法自动属于final方法),这样子类就不会覆写父类的这些final方法,从而就无法在调用父类构造器的时候调用子类的覆写的方法,从而避免了m = 0情况,因为这样就不会调用子类的draw方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值