继承相关的面试题

题目一:
class Fu
{
	int num = 10;
	Fu()
	{
		System.out.println("fu");
	}
}

class Zi extends Fu
{
	int num = 50;
	Zi()
	{
		System.out.println("zi");
	}

	void show()
	{
		int num = 30;
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(super.num);
	}
}

class Rectangle
{
	public static void main(String args[])
	{
		Zi z = new Zi();
		z.show();
	}
}
执行顺序:
1、类的初始化过程:成员变量的初始化,默认初始化,显示初始化,构造方法初始化。
2、Zi z = new Zi(),首先JVM在堆内存中开辟一个空间,并开始对这个内存空间进行初始化。
3、初始化过程:首先开辟空间的同时,本来是要调用 Zi 类的构造方法,但是它存在继承关系,所以首先去初始化父类的成员变量,对成员变量进行默认初始化,然后再进行显示初始化,最后调用父类的构造方法;最后到子类进行相同的操作。
4、初始化完毕之后,就把地址赋给  z,然后  z 指向 new Zi() 开辟的内存空间,z  也就可以调用 Zi 的show方法,num代表的是当前方法的局部变量,this.num代表的是当前类的全局变量num,super.num代表的是父类的num。
5、输出结果:fu,zi,30,50,10
题目二:
class Fu
{
	static
	{
		System.out.println("父类静态代码块");
	}

	{
		System.out.println("父类构造代码块");
	}

	Fu()
	{
		System.out.println("父类构造方法");
	}
}

class Zi extends Fu
{
	static
	{
		System.out.println("子类静态代码块");
	}

	{
		System.out.println("子类构造代码块");
	}

	Zi()
	{
		System.out.println("子类构造方法");
	}
}

class Text
{
	public static void main(String args[])
	{
		Zi zi = new Zi();
	}
}

执行顺序:
1、执行new Zi(),JVM开辟空间,同时为对应的内存空间进行初始化。初始化过程如下:
2、本来首先对子类进行初始化,但是子类继承父类,所以首先初始化父类,但这次不是首先初始化父类的构造方法,而是首先实行父类的静态代码块,因为静态代码块是用于初始化类的,类一旦加载,就会首先执行静态代码块。
3、执行完父类的静态代码块,就会执行子类的静态代码块,执行完子类的静态代码块就会执行父类的构造代码块,然后再执行构造方法,执行完父类的构造方法,就会在子类执行相同的操作。
4、Q:为什么会先执行构造代码块,再执行构造方法?
      A:因为构造代码块是初始化所有的对象的,而构造方法是初始化对应的对象的,比如 Zi() 只是用于zi对象的初始化。
5、Q:为什么会先执行静态代码块,然后再执行构造代码块?
      A:因为静态代码块是初始化类的,构造代码块是初始化对象的,类一旦加载就会执行静态代码块,对象一旦建立就会执行构造代码块。


题目三:
class A
{
	B b = new B();
	A()
	{
		System.out.println("A的构造方法");
	}
}

class B
{
	B()
	{
		System.out.println("B的构造方法");
	}
}

class Text extends A
{
	B b = new B();
	Text()
	{
		System.out.println("Text的构造方法");		
	}

	public static void main(String args[])
	{
		new  Text();
	}
}

执行顺序:
1、main函数入口,执行new Text(),JVM为其开辟空间,然后初始化步骤如下:
2、原本是首先初始化Text类的,但是因为Text类有继承关系,所以首先对父类A进行初始化,首先对父类的成员变量进行初始化,执行new B(),也同时执行B类的构造方法,打印内容。然后才执行A类的构造方法,打印内容。最后,父类才初始化完成。
3、然后到Text子类进行初始化工作。首先执行new B(),同时执行B的构造方法,然后再往下指向,执行Text的构造方法,最后,初始化完成,程序停止。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值