我想了解隐藏在 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
}
它得到了预期的输出......好的 setMember 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 成员有两个实例......但是如果有两个实例,那么阴影意味着什么?隐藏仅对第二种情况有用吗?