Javaでの隠蔽の仕組みを理解したいと思います。 は、だから私は、私がNullPointerExceptionで光栄取得コンパイルした場合は、コード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());
}
}
次したと仮定することができます。私はそれが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の OK setMemberので、私はこの方法でこれを説明することができるから1を上書きします。 少し遊んで、BからsetMemberを削除して、NullPointerExceptionを取り戻しました。しかし、それは再びコンパイルし、私は
public class A{
protected SomeClass member;
public A(SomeClass member){
setMember(member);
}
public void setMember(SomeClass sc){
member = sc;
}
}
にAのコードを変更した場合、工assメンバーの2つのインスタンスが実際に存在しているように私には思える私に出力を提供します...しかし、2つのインスタンスがある場合、何がシャドーイング意味しますか?後者の場合にだけ隠れることは有用でしょうか?
最初の例は 'b'にメンバー' sc'がないため、コンパイルされません。これは 'System.out.println(b.sc.toString());')で失敗します。あなたのコンパイラがこれを受け入れるなら、それは壊れています。 –