在你执行OrderOfInitialization 类时,首先找到这个类的入口函数main---》Card t = new Card();将首先初始化card里面的成员变量,他的成员变量为:Tag t12 = new Tag(1); Tag t2 = new Tag(2); Tag t3 = new Tag(3); 然后调用card类的构造函数。然后输出了Card();有因为构造函数调用了t3 = new Tag(33); 所以输出Tag(33)。然后这个 Card t = new Card();执行完成,执行下一语句: t.f(); 所以输出了f(). 其实最难了解的就是前3个,因为他门是类的成员变量所以没有调用构造函数 前就先初始化。
class Tag { Tag (int er) { System.out.println("Tag("+er+")"); } }class Card { int card; Tag t12 = new Tag(1); //Before constructor Card () { // Indicate we're in the constructor: System.out.println("Card.card=="+card); System.out.println("Card()"); t3 = new Tag(33); //Re-initialize t3 } Tag t2 = new Tag(2); //After constructor void f() { System.out.println("f()"); } Tag t3 = new Tag(3); //At end }public class OrderOfInitialization { static int first=first(); public static int first() { System.out.println("I am the first !!"); return 123; } public static void main(String[] args) { System.out.println("in the main"); Card t = new Card(); t.f(); //Shows that construction is done } }///:~/* 运行一下这个程序,就发现main()不是入口!! 可见一个类的 main 方法未必是第一个执行的,所以不一定是入口! java OrderOfInitialization == (new OrderOfInitialization()).main(); 这是我的感觉,我也不知道JVM是怎么工作的~~ 就是说你在用 java OrderOfInitialization 的时候,JVM 先 new 一个 类OrderOfInitialization的对象,这个对象的初始化顺序也是按照下面这个顺序来进行的。 一个类的初始化及执行顺序: static 变量---〉static 函数(被前面的static变量调用的时候才执行,当然也包括main,因为main也是static方法)-->非static变量的自动初始化(先自动初始化为默认值,比如int的先赋值0,再在构造方法里面修改--〉构造方法 以上是一家之言,但这样理解和JVM的实现是一样的,欢迎大家讨论 当然 用 static方法给 static 变量赋值有点变态,Deprecated!!! */
1。在类中定义的变量
2。执行构造函数
然后调用card类的构造函数。然后输出了Card();有因为构造函数调用了t3 = new Tag(33); 所以输出Tag(33)。然后这个 Card t = new Card();执行完成,执行下一语句:
t.f();
所以输出了f().
其实最难了解的就是前3个,因为他门是类的成员变量所以没有调用构造函数 前就先初始化。
1.static类型的class级别变量
2.非static类型的class级别变量
3.构造函数如同一级别的变量有多个,按在source code 中出现的顺序初始化。
真的很感谢你
虽然我不是这个帖的主人
但是
我觉得仍然有必要向你谢谢
Tag (int er) {
System.out.println("Tag("+er+")");
}
}class Card {
int card; Tag t12 = new Tag(1); //Before constructor
Card () {
// Indicate we're in the constructor:
System.out.println("Card.card=="+card);
System.out.println("Card()");
t3 = new Tag(33); //Re-initialize t3
}
Tag t2 = new Tag(2); //After constructor
void f() {
System.out.println("f()");
}
Tag t3 = new Tag(3); //At end
}public class OrderOfInitialization {
static int first=first();
public static int first()
{
System.out.println("I am the first !!");
return 123;
}
public static void main(String[] args) {
System.out.println("in the main");
Card t = new Card();
t.f(); //Shows that construction is done
}
}///:~/*
运行一下这个程序,就发现main()不是入口!!
可见一个类的 main 方法未必是第一个执行的,所以不一定是入口!
java OrderOfInitialization ==
(new OrderOfInitialization()).main();
这是我的感觉,我也不知道JVM是怎么工作的~~
就是说你在用 java OrderOfInitialization 的时候,JVM 先 new 一个 类OrderOfInitialization的对象,这个对象的初始化顺序也是按照下面这个顺序来进行的。
一个类的初始化及执行顺序: static 变量---〉static 函数(被前面的static变量调用的时候才执行,当然也包括main,因为main也是static方法)-->非static变量的自动初始化(先自动初始化为默认值,比如int的先赋值0,再在构造方法里面修改--〉构造方法
以上是一家之言,但这样理解和JVM的实现是一样的,欢迎大家讨论
当然 用 static方法给 static 变量赋值有点变态,Deprecated!!!
*/
其实你应该看看关于static的资料。
这主要和static型变量有关。
但是当你执行一个类时,他的执行顺序和new一个类是不一样的,被执行的类,只初始化static型的变量,然后就进入main方法。
呵呵,看到你的话,我很开心,但是没有必要谢我哦,呵呵。
祝你好运。