当前位置:编程学习 > JAVA >>

类和对象 问题 求救大神

    public class Person {  
      
        public Person(int id) {  
            System.out.println("person(" + id + ")");  
        }  
      
        public static void main(String[] args) {  
            Build b = new Build();  
        }  
    }  
      
    class Build {  
        Person p1 = new Person(1);  
      
        public Build() {  
            System.out.println("this is build's block!");  
            Person p2 = new Person(2);  
        }  
      
        Person p3 = new Person(3);  
      
    }  



为什么输出的是这个?
person(1)
person(3)
this is build's block!
person(2)

main方法 第一句是 Build b = new Build();  
应该先执行 Build的无参构造方法啊 --------------------编程问答-------------------- 没人吗》? help me~ --------------------编程问答-------------------- 属性构造会重新排序,放在当前类的构造函数之前 --------------------编程问答-------------------- 这里有相关信息
这题不需要大神,我都懂 --------------------编程问答-------------------- ...大神哪来这么低的标准
成员变量先于一个类的构造器之前执行

--------------------编程问答--------------------
引用 4 楼 Cecil_911 的回复:
...大神哪来这么低的标准
成员变量先于一个类的构造器之前执行


这个不是成员变量啊, 是new出来的对象啊,  --------------------编程问答-------------------- 成员变量的初始化会先于构造函数的! --------------------编程问答-------------------- 请看下这篇文章http://www.cnblogs.com/lmtoo/archive/2012/04/08/2437918.html
第一段是讲类变量的。
第二段将成员变量的。
看了上面这篇文章后,你就大致明白了。
你的代码在编译后会被JVM调整一下顺序。大致会优化成这个样子。

    public class Person {  
      
        public Person(int id) {  
            System.out.println("person(" + id + ")");  
        }  
      
        public static void main(String[] args) {  
            Build b = new Build();  
        }  
    }  
      
    class Build {  
        Person p1 = null;  
Person p3 = null; 

        public Build() {  
p1 = new Person(1);
p3 = new Person(3);
            System.out.println("this is build's block!");  
            Person p2 = new Person(2);  
        }  
 
      
    }

对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。
所以就出来你这样的结果 --------------------编程问答--------------------
引用
http://bbs.csdn.net/topics/390601038#quote


的的确确 先执行main方法 第一句是 Build b = new Build();  
但是 在new Build()会加载类Build的时候 会先执行 静态代码块和代码块,在执行相关方法。 --------------------编程问答-------------------- java 初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器 --------------------编程问答--------------------
引用 9 楼 qq864680621 的回复:
java 初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

哥们 我想问下,静态代码块和静态变量,还有代码块和变量定义,是不是谁在前就执行谁啊?我看书上是这么写的。。 --------------------编程问答-------------------- 同一类型的谁在前 就先执行谁 --------------------编程问答--------------------
引用 10 楼 sn_wing 的回复:
Quote: 引用 9 楼 qq864680621 的回复:

java 初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

哥们 我想问下,静态代码块和静态变量,还有代码块和变量定义,是不是谁在前就执行谁啊?我看书上是这么写的。。

恩  但是一般变量定义都是在最前面的 --------------------编程问答--------------------
引用 9 楼 qq864680621 的回复:
java 初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

请问父类--静态初始化块和父类--初始化块有什么区别,是不是向static{}这样的称作静态初始化块,初始化块又是什么样的呢?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,