为什么子类不会覆盖其超类变量的值?

时间:2014-06-25 00:38:01

标签: java

我有三个类如下,类b和c正在扩展类a。我想知道为什么代码没有读取b和c变量的值。

public class a{
  protected int myvalue = 1;

}

public class b extends a{
  private int myvalue = 2;
}

public class c extends a{
  private int myvalue = 3;
}

我主要方法的主体

   ArrayList<a> myList= new ArrayList();
   myList.add(new b());
   myList.add(new c());

   for(int i =0;i<myList.size();i++)
        System.err.println("value is:" + myList.get(i).myvalue);

输出

 1
 1

From Oracle website:

  

在一个类中,一个与该字段中的字段同名的字段   超类隐藏了超类的字段,即使它们的类型是   不同。在子类中,超类中的字段不能   由简单名称引用。相反,必须访问该字段   通过超级,这将在下一节中介绍。通常   说来,我们不建议隐藏字段,因为它会使代码变得困难   阅读。

1 个答案:

答案 0 :(得分:3)

你正在遮蔽你的领域myvalue而不是覆盖它,我相信这样的东西会做你想做的事

public class a{
  protected int myvalue = 1;
}

public class b extends a{
  public b() {
    myvalue = 2;
  }
}

public class c extends a{
  public c() {
    myvalue = 3;
  }
}

另外,请不要使用Raw Types

// ArrayList<a> mylist = new ArrayList();
ArrayList<a> mylist = new ArrayList<>(); // <a> on Java 5 and 6