深入解析Java继承问题 public class Z extens X{ Y y=new Y(面试问题)

下面是一个选择题
下列程序的运行结果是()
 
class X
{	
	Y b=new Y();
	X()
	{
		System.out.print("X");
	}	
}
class Y
{
	Y()
	{
		System.out.print("Y");
	}
}
public class Z extends X
{	
	Z()
	{
		System.out.print("Z");
	}
	Y y=new Y();
	public static void main(String[] args)
	{
		new Z();
	}
}
A Z B YZ C XYZD YXYZ

对Java较熟悉的同学,对这道题的感觉可能是会而又不会。

这道题考察的知识点主要有继承,子类实例化顺序,JVM实现机制等。

从题中,我们比较容易可以排除A,C(主要是在main方法new一个Z时,先要执行成员变量初始化,new出一个Y,打印了Y)

但很多同学可能对答案D不理解。在此我深入讲解一下


咱们先搞清楚程序执行过程把,我写在你的程序上标出程序输出过程把:
class X
{	
	Y b=new Y();                //     **********************第一个输出
	X()
	{
		System.out.print("X");  // **********第二个输出
	}	
}
class Y
{
	Y()
	{
		System.out.print("Y");
	}
}
public class Z extends X
{	
	Z()
	{
		System.out.print("Z");
	}
	Y y=new Y();   //  *** ***************************第三个输出
	public static void main(String[] args)
	{
		new Z();          // 第四个输出
	}
}
第一个知识点:继承。子类继承父类,程序执行的过程中先加载用父类,这也是出现重写的原因。所以程序先加载了类X。
第二个知识点:因为java程序在执行时先加载全局变量。在X类中的成员变量是Y b = new Y();在程序加载b 时需要调用类Y的无参构造方法,就输出了Y。
第三个知识点:构造器。程序调用默认调用的是构造器是无参构造器,所以在继承类X时,程序先执行了X的无参构造器输出x(当给这个参构造器有参数时就不会输出x)。当new一个对象时就是调用这个类的构造器。第三个输出和第四个输出和上面类似。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值