qq小小七 发表于 2014-6-30 19:40:36

程序员女妹子求助!

class Window{
Window(int m ){
System.out.println("Window" + m);
}
}
class House{
Window w1 = new Window(1);
House(){
System.out.println("House");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f(){
System.out.println("f()");
}
Window w3 = new Window(3);
}
public class OrderOfInit{
public static void main(String[] args){
House h = new House();
h.f();
}
}
为什么是这样的输出顺序?为什么构造函数里的输出会比较靠后

谢家进 发表于 2014-6-30 19:40:37

这不就是类加载的顺序吗?
1.加载静态成员/代码块
2.加载非静态成员/代码块(实例块在创建对象时才会被加载。而静态成员在不创建对象时可以加载)
3.调用构造方法

流行语 发表于 2014-7-1 10:00:30

你上网搜一下,java类创建顺序,相信对你解决这个问题有帮助。

/yhhEAST/zhh 发表于 2014-7-1 22:54:16

java中先创建类的成员变量,再创建构造函数,因为构造函数可能用到成员变量,妹纸下次贴代码注意缩进

青玄 发表于 2014-7-2 20:56:57

Windows33是将House执行完后才实例化的,所以它在House的后面!至于其它的的话,程序一般是由上往下执行的,类在加载的时候首先执行的将是类中构造方法里面的内容!

yimingpeng 发表于 2014-7-4 22:23:21

2楼正解,成员变量初始化在一切函数之前,包括构造函数,此外如果是static的成员变量,他们是最最先初始化的...

Samples、懂么 发表于 2014-7-9 18:44:03

本帖最后由 Samples、懂么 于 2014-7-9 18:47 编辑

当创建 House实例对象的时候会把House的字节码保存在内存中,因为house里面引用到了其他的类,那么在加载的时候也会顺带把需要的类字节码也一并加载到内存当中,然后初始化成员变量,所以会先输出window1,2,3把所有东西都初始化完以后,创建实例,然后执行它的构造方法,输出house语句,转为House里的实例对象是在构造方法里面,所以只有当House被创建实例的时候才会执行,所以接着输出window33,再往下走,调用f(),输出f()

百日维新 发表于 2014-8-9 01:42:53

这还有什么好不解的,java里面这么规定初始化啊

linuxyz 发表于 2014-12-7 23:20:29

class House{
        Window w1 = new Window(1);
        Window w2 = new Window(2);
        Window w3 = new Window(3);

        House(){
                System.out.println("House");
                w3 = new Window(33);
        }

        void f(){
                System.out.println("f()");
       

}
你的House的写法和我这样写效果一样

n01boy 发表于 2015-1-7 22:44:09

本帖最后由 n01boy 于 2015-1-7 22:45 编辑

java中,成员变量的位置不严格,但是一个类的加载是有顺序的。
拿你这个为例,没有静态成员变量,没有静态代码块,没有静态方法

当java 程序开始运行的时候,jvm首先找的是main方法

开始执行,main第一句 new 一个House,这个时候程序就跳到了House类中

首先执行House的构造函数(方法),但是,不会进入构造方法的代码块,
因为构造代码块的作用是对类中成员变量进行一个初始化操作,House类一加载就进入构造函数,
成员变量都还没有创建呢,进去没有意义,所以jvm(java虚拟机),要先去把成员变量w1,w2,w3创建出来,创建过程又分2种,创建的时候,成员变量有没有=等于号,也就是初始化值,有先创建个null的变量名为w1,w2,w3的成员变量,这时候,如果w1,w2,w3的后面有等于号,就把等于好右边的值计算后赋值给等号左边。

第一步:默认初始化成员变量,(w1,w2,w3)默认初始化完成后,这3个变量的值是null。

第二步:实例初始化,将等于号右边的值计算出来赋值给等于号左边(这里就去new window类了,window类中的加载顺序和这里是一样的)

第三步,成员变量 实例初始化 完成后,运行构造函数的条件满足了,构造函数中有可能用到的变量已经在内存中准备好了,就可以执行构造函数了。打印House,然后再new一个window赋值给w3.就又走了一遍window类

希望对你有帮助。{:1_1:}
页: [1]
查看完整版本: 程序员女妹子求助!