父類:
public?class?Animal?{
public?int?age?=?20;
public?String?name;
public?void?eat(){
System.out.println("動物具有吃東西的能力");
}
/*public?Animal(){
System.out.println("Animal類執(zhí)行了");
}*/
public?Animal(int?age){
this.age?=?age;
System.out.println(age);
}
}
子類:
public?class?Dog?extends?Animal?{
public?static?int?age?=?15;
public?void?eat(){
System.out.println("狗具有吃骨頭的能力");
}
public?Dog(){
super(age);
System.out.println("dog類執(zhí)行了");
}
public?void?method(){
super.eat();
}
}
我在定義時為什么要在子類的age屬性定義前加static?
既然是父類的age?為何我在調用method()時輸出的age是15而不是父類的20?
2016-05-18
你子類構造方法中調用的age是Static的age,就是子類的age,首先回答static的問題,static是靜態(tài)的意思,即未創(chuàng)建實例對象就可以使用被static聲明的屬性,如果你不加static,在創(chuàng)建Dog類時,1.首先進行父類的默認值初始化,就是age=20,2.然后調用父類構造函數,3.再進行子類默認值初始化,即age=15,4.再調用子類構造函數,在第二步時,發(fā)現父類構造方法需要傳一個值(super(age);)這時候編譯器找age,發(fā)現找不到age,因為這時候還沒有進行到第三步啊,age沒有初始化為15,報錯,而將其聲明為static,即使不創(chuàng)建對象age都是15,這就不必解釋了,所以要加static
第二個問題,就像之前所說的一樣,加了static之后,進行第二步時,將age=15傳給父類,修改了父類中的age值,導致父類和子類的age都是15,所以無論怎么輸出都是15
2016-05-21