说我有这个代码
public class A {
String name = "a";
public void one(){
System.out.println(name);
}
public void two(){
System.out.println(name);
}
public static void main(String[] args){
A a = new A();
B b = new B();
b.one();
}
}
class B extends A{
String name="b";
public void two(){
System.out.println(name);
}
}
我无法弄清楚为什么b.one()总是产生“a”。根据我所知的继承,B会发现它没有自己的one()副本,所以它会超级()。 super.one()将打印出该类中变量名(a)的值。然而,不会B看到它也有一个名称变量,其值为“b”,所以不会去那?我很困惑因为我知道这个逻辑适用于方法调用。任何人都可以澄清这个吗?
答案 0 :(得分:2)
你自己的问题部分回答了自己。你做super.one()
的那一刻你不再是'B'。因此,除了name
中的“a”之外,你为什么还要期待别的东西。调用超类后引用的name
是A
的名称。如果name
为name
或public
且您未重新声明,则可以更改子类中protected
的值。
public class A
{
protected String name;
public void printName()
{
System.out.println(name);
}
}
public class B extends A
{
public B()
{
name = "b";
}
}
public class Main
{
public static void main(String [] args)
{
B b = new B();
b.printName();
}
}
上面的代码将打印“B”。