黑马程序员技术交流社区

标题: 类初始化问题 [打印本页]

作者: hyw840705183    时间: 2013-4-28 18:09
标题: 类初始化问题
本帖最后由 hyw840705183 于 2013-4-29 12:57 编辑

import static cn.nchu.out.Print.*;//引入的自定义jar包

class Window {
        Window(int marker){
                print("Window("+ marker +")");
        }
}

class House {
        Window w1 = new Window(1);//创建Window第一个对象
        House() {
                print("House()");
                w3 = new Window(33);
        }
        Window w2 = new Window(2);//创建Window第二个对象
        void f() {
                print("f()");
        }
        Window w3 = new Window(3);//创建Window第三个对象
}

public class OrderOfInitialization {
        public static void main(String[] args){
                House h = new House();
                h.f();
        }
}
最终运行结果:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
有谁能详细解释下吗,我认为运行结果为:
Window(1)
House()
Window(33)
Window(2)
f()
Window(3)





作者: 肖宇宥    时间: 2013-4-28 18:58
成员变量的初始化,在类的所有方法调用之前进行,包括构造方法,即成员变量-->构造方法-->普通方法
作者: 董波    时间: 2013-4-28 19:09
在创建一个类的对象时,会先加载该类,加载的时候就会加载类的成员变量,前3个输出结果"Window(1)、Window(2)、Window(3)"就是在这时输出的;jvm在加载完类之后开始为你创建对象,也就是执行House h = new House()这行代码,"House()、Window(33)"这两个结果就是在执行构造函数时输出的;就下来就是执行你的函数调用h.f(),输出"f()".
作者: 孙浩    时间: 2013-4-28 19:16
类的初始化顺序:
    1.静态代码块 2.属性的默认初始化3.属性的显示初始化与构造代码块按上下顺序执行4.构造方法
作者: 黑马-秦歌    时间: 2013-4-29 09:58
静态变量 -->> 成员变量 ->> 构造函数里的变量 -->> 成员方法里的变量
作者: 赵崇友    时间: 2013-4-29 10:19
本帖最后由 赵崇友 于 2013-4-29 10:21 编辑

你的程序执行的顺序是:在声明House h时,Java虚拟机会现将House字节码文件加载进内存,即使你没有创建实例对象也是如此的。然后就对House类中的成员进行默认初始化,Window w1,Window w2,Window w3,它们的默认值都是null,然后才是显示初始化,依次就是分别w1=new Window(1);w2=new Window(2);w3=new Window(3);因此在你创建House对象之前,就会输出Window(1) 、Window(2)、 Window(3)。然后就是实例化House对象了,后面的顺序自然而然就是Hosue(),Window(33),f()了。初始化的顺序我标出来了
不知道,我说的够清楚不!!
  1. import static cn.nchu.out.Print.*;//引入的自定义jar包

  2. class Window {
  3.          Window(int marker){
  4.                  print("Window("+ marker +")");
  5.          }
  6. }

  7. class House {
  8.          Window w1 = new Window(1);//创建Window第一个对象1111111
  9.         House() {
  10.                  print("House()");4444444
  11.                  w3 = new Window(33);5555555555
  12.          }
  13.          Window w2 = new Window(2);//创建Window第二个对象2222222222
  14.         void f() {
  15.                  print("f()");666666666666
  16.          }
  17.          Window w3 = new Window(3);//创建Window第三个对象333333333
  18. }

  19. public class OrderOfInitialization {
  20.          public static void main(String[] args){
  21.                  House h = new House();
  22.                  h.f();
  23.          }
  24. }
复制代码

作者: hyw840705183    时间: 2013-4-29 12:56
谢谢各位,我了解了。。。




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