黑马程序员技术交流社区

标题: 一道java继承的小题,执行逻辑不太明白,求大神解惑 [打印本页]

作者: visen    时间: 2015-8-17 00:07
标题: 一道java继承的小题,执行逻辑不太明白,求大神解惑
我编译运行出来,答案是:YXYZ,但是它的执行逻辑还不是很清楚,求大神解惑呀
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();
        }
}
作者: sven556677    时间: 2015-8-17 08:07
貌似那个 Y b = new Y();相当于初始化代码块
改了一下后结果如下:
  1. class X{
  2. //        Y b = new Y();
  3.         {System.out.println("2");}
  4.         X(){
  5.                 System.out.println("X");
  6.         }
  7. }
  8. class Y{
  9.                
  10.         Y(){
  11.                 System.out.print("Y");
  12.         }
  13. }
  14. public class Test2 extends X{
  15. //        Y y = new Y();
  16.         {System.out.println("1");}
  17.         Test2(){
  18.                 System.out.print("Test2");
  19.         }
  20.         public static void main(String[] args){
  21.                 new Test2();
  22.         }
  23. }
复制代码

作者: sven556677    时间: 2015-8-17 08:37
又想了一下,其实 Y b = new Y();这句话是属于类里面的,new XX首先是加载类,再调用对象的初始化。就像你把 Y b = new Y();这句换成是int a=333;,那所创建的class X和Z中肯定都有这个int a,同理类一加载就会创建Y b这个对象并初始化一次。
作者: JXHIUUI    时间: 2015-8-17 08:45
在子类的第一行有一句隐式的语言super( )会先执行,so 你再思考一下!
作者: l_15562009298    时间: 2015-8-17 09:47
继承 哪个类 便预加载哪个类,之后才执行当前类
作者: iamzk    时间: 2015-8-17 10:38
楼上正解
作者: visen    时间: 2015-8-17 22:06
sven556677 发表于 2015-8-17 08:37
又想了一下,其实 Y b = new Y();这句话是属于类里面的,new XX首先是加载类,再调用对象的初始化。就像你 ...

非常感谢!!
作者: keviner    时间: 2015-8-17 23:53
子类复写方法,运行子类方法
作者: code_linux    时间: 2015-8-18 00:37
醉了。。。
作者: cc3441251    时间: 2015-8-18 08:31
请大神把程序的执行顺序说一下,我对答案中第三个y怎么来的,不清楚,谢谢了
作者: kevin986745    时间: 2015-8-18 08:39
继承学好了就不会有这样的问题!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2