package oop1;class X { Y b = new Y();
X() {
System.out.print("X");
}
}class Y { Y() {
System.out.print("Y");
}
}public class Z extends X { Y y = new Y();
Z() {
System.out.print("Z");
} public static void main(String[] args) {
new Z();
}
}
package oop2;
class X {
void N(){
System.out.println("N");
}
Y b = new Y();
X() {
System.out.print("X");
}
}class Y {
void M(){
System.out.println("M");
}
Y() {
System.out.print("Y");
}
}public class Z extends X {
void K(){
System.out.println("K");
}
Y y = new Y();
Z() {
System.out.print("Z");
} public static void main(String[] args) {
new Z();
}
}
上述两个小栗子的输出结果都是:YXYZ  请问这是为什么?
麻烦详细说明下,这一块不太懂,忘大神赐教,本菜鸟不胜感激。
我的理解:
第一段代码我能看懂,看到结果后,秒懂为什么了。可以不需要多解释。
关键是第二段,我加了N,M,K进去为什么没输出来。是因为在new对象的时候,只执行需要new的那一段代码吗?
不是从上到下依次执行吗?

解决方案 »

  1.   

    你都没有掉void()方法的地方当然没有输出NMK。。你再main函数里面实例化一个Z,因为Z是继承自X的,在调用Z的无参构造方法之前会执行父类无参构造方法,父类初始化时,所有先去初始化X类中的一些成员以及静态语句块{}等,然后再执行构造方法,这里的成员Y y = new Y();所以调用Y的构造方法打印Y,接着打印X。回到Z中也同理,总之记住先初始化成员变量以及静态语句块,再执行构造方法这个顺序就行了
      

  2.   

    第一个 因为你Z继承了X ,所以当你实例Z的时候会对X进行操作,执行X类中的对象Y 然后最后执行构造方法X()
    然后就输出了YX 接下来 才是真正的Z对象的创建,也就是先执行变量Y(Y对象的创建)最后执行Z()构造方法。
    输出了YXYZ第二个呢  你没理解到 那是因为你第一个就理解错误了。
    创建对象的时候会默认的执行构造方法也就是类名对应的那个方法。然而你自己定义的那个方法是不会执行的,除非你自己去调用。所以你第二个定义的NM方法根本不会去执行因为你没有通过指定对象去调用它们。比如你调用Z对象中的K()方法,那么就是new Z().k()去调用
      

  3.   

    我没去掉void和我用System.out.println();语句输出不矛盾吧
      

  4.   

    我没去掉void和我用System.out.println();语句输出不矛盾吧掉->调 我打错字了,我以为你能明白。。
      

  5.   

    不是void的问题,成员方法不会在类初始化时执行
      

  6.   

    其实new只是一个操作,它在内存中给对象申请了一块内存用来储存对象信息,而Classname()它是一个特殊的方法(构造方法或构造器),java规定它必须紧跟在new操作后面,既然是一个方法,那它就有自己的处理机制(方法体),所以你  Y b = new Y();这个式子就是声明了一个类型为Y的变量叫做b,并且在内存中创建了一个Y的实体然后调用构造方法Y(),(执行System.out.print("Y");输出Y)最后把实体的引用赋给b,以便b以后来操作这个实体。所以整个过程并没有调用其它方法,自然你的void M()中的 System.out.println("M");没有执行,自然不会输出M.其他的类似于这个。
    写的比较繁琐,不懂的话再问或再看看书