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
}
そしてそれは期待通りに出力を取得します...oksetMember of B 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メンバーのインスタンスが2つあるように見えますが、インスタンスが2つある場合、シャドウイングとはどういう意味ですか?非表示は2番目の場合にのみ役立ちますか?