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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mirror 中级黑马   /  2014-7-8 13:03  /  1430 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

http://bbs.itheima.com/thread-127965-1-1.html  这个帖子中的程序,有些不明白的地方  希望大家指点1 程序运行后,为什么是先运行 X类中的 Y b = new Y(),而不是Z中的Y y = new Y();
2在super()运行过程是怎样的呢  为什么不再super()完后执行System.out.print("Z");
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() {
                        super(); 
                        System.out.print("Z");
                }
                public static void main(String[] args) {
                        new Z();
                }
        }


10 个回复

倒序浏览
子类对象在实例化的过程中,首先会调用父类的构造方法,这里的super()有没有效果都是一样的,构造方法的作用就是对该类的属性初始化,只有父类都准备完毕以后才会调用子类的构造方法,实现子类属性的初始化
回复 使用道具 举报
super()应该写在第一行吧!最先读的就是super();
回复 使用道具 举报
001可望成功 发表于 2014-7-8 13:21
子类对象在实例化的过程中,首先会调用父类的构造方法,这里的super()有没有效果都是一样的,构造方法的 ...

可以详细的说一说不
回复 使用道具 举报
mirror 发表于 2014-7-8 19:32
可以详细的说一说不
  1. Z() {
  2.                         super(); 
  3.                         System.out.print("Z");
  4.                 }
复制代码


子类构造函数中,首先要调用父类的构造函数。这里Z的构造函数,首先执行的是super(), 也就是
  1. X() {
  2.                         System.out.print("X");
  3.                 }
复制代码

X没有指明父类,就是默认继承Object,X的构造函数第一行会有一个默认的super()执行Object的构造函数。Object的构造函数做的事情就不去说了,在这里不会有什么可见的效果。关键是,当Object的构造函数执行完毕后返回X的构造函数,接下来执行的不是System.out.print("X");而是对X的成员变量进行初始化。也就是Y b = new Y()。这样解释能明白吗?
回复 使用道具 举报
说不出来
回复 使用道具 举报
首先读一个程序的时候从主函数入口,主函数new了一个z(),那么就会先调用z的构造方法,在z构造方法中有super()那么就会先去构建父类,在构建父类过程中先执行构造方法,但是不会执行任何语句,之后就会执行 Y b = new Y();
回复 使用道具 举报
子类对象实例化的具体过程?1、为子类对象分配内存空间,对域变量进行默认初始化。2、绑定构造方法,将new对象中的参数传递到构造方法的形式参数。3、调用this或super语句(注意二者只可以出现其一)4、进行实例变量的显式初始化操作5、执行当前构造方法体的程序代码.
通过这个准则,去看代码就轻松了,首先执行main方法,对Z中的变量y分配空间,并默认初始化,然后再执行super(),也就是X的构造函数,再对应这个准则,为X中的变量y分配内存空间,并默认初始化。在执行第4步,new Y()赋值给X 中的y,即打印"Y",再执行第五步,构造函数,打印“X",然后再对Z 中的成员变量就行赋值,new Y().打印"Y",再执行Z的构造函数,即打印”Z"
回复 使用道具 举报
/*
下面是有继承关系后,创建对象初始化的顺序。
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法

*/
class X
{       
        //父类的实例成员,执行优先为第3
        Y b=new Y(1);
        X()
        {
                //接下来就调用父类构造函数,执行优先为第4
                System.out.println("X");
        }
        class Y
        {
                Y()
                {
                        System.out.println("Y");
                }
                Y(int a)
                {
                        System.out.println("A");
                }
        }
}
class Z extends X
{
        //子类实例成员被执行,执行优先为第5
        Y y=new Y();
        Z()
        {
                //最后才执行子类构造方法,执行优先第6
                System.out.println("Z");
        }
        public static void main(String[] args)
        {
                Z z=new Z();
        }
}
按照上面的规则打印的就是 A X Y Z
回复 使用道具 举报
没有翅膀的小鸟 发表于 2014-7-8 22:32
/*
下面是有继承关系后,创建对象初始化的顺序。
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序 ...

多谢 明白了
回复 使用道具 举报
fantacyleo 发表于 2014-7-8 21:07
子类构造函数中,首先要调用父类的构造函数。这里Z的构造函数,首先执行的是super(), 也就是

X没有指 ...

明白了  多谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马