java继承处理字段

时间:2014-06-22 03:44:12

标签: java inheritance subclass super

说我有这个代码

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”,所以不会去那?我很困惑因为我知道这个逻辑适用于方法调用。任何人都可以澄清这个吗?

1 个答案:

答案 0 :(得分:2)

你自己的问题部分回答了自己。你做super.one()的那一刻你不再是'B'。因此,除了name中的“a”之外,你为什么还要期待别的东西。调用超类后引用的nameA的名称。如果namenamepublic且您未重新声明,则可以更改子类中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”。