- 相關(guān)推薦
sun認(rèn)證考試:java子對象創(chuàng)建過程
Java 創(chuàng)建子類對象的過程:
public class F511
{
private int ff=100;
protected int m=880;
F511()
{
m=add(8);
}
int add(int i){
return i+m;
}
public static void main(String args[]){
F511 f=new F511();
System.out.println("f="+f.m);
S511 s=new S511();
System.out.println("s="+s.m+" t= "+s.t);
}
}
class S511 extends F511
{
protected int ss=111;
S511(){
m+=ss;
t=add(9);
}
int add(int i){
return i*ss;
}
}
大家自己先分析一下運算后的結(jié)果,然后在看下面結(jié)果:
答案是:f=888
m=111
通過這個例子可以很好的學(xué)習(xí)到j(luò)ava繼承父類,運行的先后順序和機(jī)制。
現(xiàn)在我添加一下東西到程序中,方便我們分析:
public class F511
{
private int ff=100;
protected int m=880;
protected int t=880;
static int k=0;
F511()
{
System.out.println("this is parents = "+m);
m=add(8);
System.out.println("this is parents m=add(8) = "+m);
}
int add(int i){
System.out.println("k= "+k);
k++;
return i+m;
}
public static void main(String args[]){
F511 f=new F511();
System.out.println("f="+f.m);
S511 s=new S511();
System.out.println("s="+s.m+" t= "+s.t);
}
}
class S511 extends F511
{
protected int ss=111;
static int j=0;
S511(){
System.out.println("this in childe print parents = "+m);
m+=ss;
t=add(9);
}
int add(int i){
System.out.println("j= "+j);
j++;
System.out.println("ss= "+ss);
return i*ss;
}
}
運行結(jié)果是:
this is parents = 880
k= 0
this is parents m=add(8) = 888
f=888
this is parents = 880
j= 0
ss= 0
this is parents m=add(8) = 0
this in childe print parents = 0
j= 1
ss= 111
s=111 t= 999
輸出完成 (耗時 0 秒) - 正常終止
從這里可以看出,子類繼承父類后。在創(chuàng)建子類對象時,首先初始化父類的無參構(gòu)造函數(shù)F511()執(zhí)行其中的方法。由于父類無參構(gòu)造方法中add()方法被子類重寫了,因此父類調(diào)用子類的add()方法,這就是為什么會輸出j=0,又由于父類中沒有ss變量,所以ss默認(rèn)就為0.所以父類初始化后,m=0了。然后才在初始化子類無參構(gòu)造函數(shù)S511()。由于m變成了0,所m+=ss,就為111了。這就是創(chuàng)建子類,函數(shù)初始化的過程。
所以,在構(gòu)造器中有應(yīng)避免調(diào)用可能被改寫的方法,不然上上面會出現(xiàn)某些意想不到的結(jié)果。
【sun認(rèn)證考試:java子對象創(chuàng)建過程】相關(guān)文章:
Sun java認(rèn)證考試答案10-23
Sun認(rèn)證Java開發(fā)員考試介紹06-25
sun java認(rèn)證考試題庫09-04
sun認(rèn)證java程序員08-05
sun認(rèn)證java基礎(chǔ)模擬試題09-16
SUN認(rèn)證考試流程08-22
Sun的四大Java認(rèn)證體系10-08