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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hyw840705183 中级黑马   /  2013-4-28 18:09  /  1339 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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)




评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

正序浏览
谢谢各位,我了解了。。。
回复 使用道具 举报
本帖最后由 赵崇友 于 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. }
复制代码
回复 使用道具 举报
静态变量 -->> 成员变量 ->> 构造函数里的变量 -->> 成员方法里的变量
回复 使用道具 举报
类的初始化顺序:
    1.静态代码块 2.属性的默认初始化3.属性的显示初始化与构造代码块按上下顺序执行4.构造方法

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
在创建一个类的对象时,会先加载该类,加载的时候就会加载类的成员变量,前3个输出结果"Window(1)、Window(2)、Window(3)"就是在这时输出的;jvm在加载完类之后开始为你创建对象,也就是执行House h = new House()这行代码,"House()、Window(33)"这两个结果就是在执行构造函数时输出的;就下来就是执行你的函数调用h.f(),输出"f()".

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
成员变量的初始化,在类的所有方法调用之前进行,包括构造方法,即成员变量-->构造方法-->普通方法

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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