java对象初始化问题

public class OrderOfInitialization {
public static void main(String[] args) {
[color=red]Card t = new Card();[/color]
t.f();
}
}
class Tag {
Tag(int marker) {
System.out.println("Tag(" + marker + ")");
}
}
class Card {
Tag t1 = new Tag(1);
Card() {
System.out.println("Card()");
t3 = new Tag(33);
}
Tag t2 = new Tag(2);
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3);
}
为什么打印的结果是:
Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()
在红色代码处开始 所有的Tag对象为什么先在Card()构造函数之前调用

[quote]Tag t1 = new Tag(1);
Card() {
System.out.println("Card()");
t3 = new Tag(33);
}
Tag t2 = new Tag(2);
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3); [/quote]
这跟程序代码写的顺序无关。。
JAVA程序有个类的运行顺序。。
这里是Card t = new Card();

先调用Card()的属性才到构造函数。。
所以Tag(1)
Tag(2)
Tag(3)
然后运行构造函数
Card()
Tag(33)
最后运行 t.f();
下面有个实例的说明,Java类的基本运行顺序
[url]http://yqsshr.blog.51cto.com/469059/147687[/url]

看我的文章说明
http://lovewhzlq.iteye.com/admin/blogs/452636

http://lovewhzlq.iteye.com/admin/blogs/457716

在main里面 先是new card(),所以到class Card()方法里执行,执行new Tag(),因此找到Class Tag()方法来执行,
Tag(int marker) {
System.out.println("Tag(" + marker + ")");
}

因此所有的tag会在card之前输出,

执行完new Tag()后来执行class Card()方法里的card(){
System.out.println("Card()");
t3 = new Tag(33);
} 输出card()和tag(33),
到最后执行void f() {
System.out.println("f()");
} 输出f()。

1、类的初始化顺序

(父类--静态变量 或 父类--静态初始化块 )->(子类--静态变量 或 子类--静态初始化块)->(父类--变量 或 父类--初始化块)->

父类--构造器 ->(子类--变量 或 子类--初始化块) ->子类--构造器

静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

当然,可能和jvm 的底层实现也有点关系,不同jvm 可能有不同的结果。

上面是我blog 上摘录的。

你的问题看了上面就知道了。。
我来解释下你的代码
[code]
class Card {
Tag t1 = new Tag(1);//属于card的变量所以在该类的构造器之前加载
Card() {
System.out.println("Card()");
t3 = new Tag(33);
}
Tag t2 = new Tag(2);//属于card 的变量所以在该类的构造器之前加载(如果和t1 换顺序的话,那这个类的首先加载)

void f() {
    System.out.println("f()");
}
Tag t3 = new Tag(3);//同理

}
[/code]

在构造器之前会做下扫描的。。看下有没父类或者类的变量等有没加载。。