我想了解如何在Java中隱藏工作。 所以,讓我們假設你有下面的代碼關於在Java中隱藏/遮蔽成員變量的問題
public class A{
protected SomeClass member;
public A(SomeClass member){
this.member = member;
}
}
public class B extends A{
protected SomeClass member;
public B(SomeClass member){
super(member);
}
public static void main(String[] args){
SomeClass sc = new SomeClass();
B b = new B(sc);
System.out.println(b.member.toString());
}
}
如果我編譯我得到一個NullPointerException異常榮幸。我認爲這將是sc.toString()的輸出;
我改變這個代碼
public class A{
protected SomeClass member;
public A(SomeClass member){
setMember(member);
}
public void setMember(SomeClass sc){
this.member = sc;
}
}
public class B extends A{
protected SomeClass member;
public B(SomeClass member){
super(member);
}
public void setMember(SomeClass sc){
this.member = sc;
}
//...main
}
,並得到預期的輸出... B的確定setMember重寫從A一個這樣我就可以這樣解釋。 我玩了一下,並從B中刪除了setMember以獲取返回NullPointerException。但它再次編譯並給了我輸出,如果我改變A的代碼以
public class A{
protected SomeClass member;
public A(SomeClass member){
setMember(member);
}
public void setMember(SomeClass sc){
member = sc;
}
}
在我看來,有其實SomeClass的成員的兩個實例...但拿什麼陰影,如果有兩個實例?第二種情況只隱藏有用嗎?
你的第一個例子不會編譯,因爲'b'沒有'sc'成員。它在'System.out.println(b.sc.toString());'失敗。如果你的編譯器接受這個,它就壞掉了。 –