【发布时间】:2011-09-22 08:15:39
【问题描述】:
我想了解 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 成员实际上有两个实例......但是如果有两个实例,那么阴影意味着什么?隐藏只对第二种情况有用吗?
【问题讨论】:
-
您的第一个示例无法编译,因为
b没有成员sc。它在System.out.println(b.sc.toString());失败。如果你的编译器接受这个,它就坏了。
标签: java shadowing member-hiding