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