A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我编译运行出来,答案是: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();
        }
}

10 个回复

倒序浏览
貌似那个 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. }
复制代码
回复 使用道具 举报
又想了一下,其实 Y b = new Y();这句话是属于类里面的,new XX首先是加载类,再调用对象的初始化。就像你把 Y b = new Y();这句换成是int a=333;,那所创建的class X和Z中肯定都有这个int a,同理类一加载就会创建Y b这个对象并初始化一次。
回复 使用道具 举报
在子类的第一行有一句隐式的语言super( )会先执行,so 你再思考一下!
回复 使用道具 举报 1 0
继承 哪个类 便预加载哪个类,之后才执行当前类
回复 使用道具 举报
楼上正解
回复 使用道具 举报
visen 中级黑马 2015-8-17 22:06:04
7#
sven556677 发表于 2015-8-17 08:37
又想了一下,其实 Y b = new Y();这句话是属于类里面的,new XX首先是加载类,再调用对象的初始化。就像你 ...

非常感谢!!
回复 使用道具 举报
子类复写方法,运行子类方法
回复 使用道具 举报
醉了。。。
回复 使用道具 举报
cc3441251 来自手机 中级黑马 2015-8-18 08:31:54
10#
请大神把程序的执行顺序说一下,我对答案中第三个y怎么来的,不清楚,谢谢了
回复 使用道具 举报
继承学好了就不会有这样的问题!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马