歡迎您光臨本站 註冊首頁

java子對象創建過程及多態

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
Java 創建子類對象的過程:
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;
}
}
大家自己先分析一下運算后的結果,然後在看下面結果:
答案是:f=888
m=111
通過這個例子可以很好的學習到java繼承父類,運行的先後順序和機制.
現在我添加一下東西到程序中,方便我們分析:
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;
}
}
運行結果是:
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 秒) - 正常終止
從這裡可以看出,子類繼承父類后.在創建子類對象時,首先初始化父類的無參構造函數F511()執行其中的方法.由於父類無參構造方法中add()方法被子類重寫了,因此父類調用子類的add()方法,這就是為什麼會輸出j=0,又由於父類中沒有ss變數,ss默認就為0.父類初始化后,m=0了.然後才在初始化子類無參構造函數S511().由於m變成了0,所m =ss,就為111了.這就是創建子類,函數初始化的過程.
,在構造器中有應避免調用可能被改寫的方法,不然上上面會出現某些意想不到的結果.


[火星人 ] java子對象創建過程及多態已經有242次圍觀

http://coctec.com/docs/java/show-post-60006.html