下面是一个选择题
下列程序的运行结果是()
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一个对象时就是调用这个类的构造器。第三个输出和第四个输出和上面类似。