3 回答
TA贡献1887条经验 获得超5个赞
因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。
字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在允许超类完成它的工作。
TA贡献1841条经验 获得超3个赞
您可以隐藏字段,但不能覆盖它。
隐藏意味着字段的值取决于所访问的类。子类中的字段将“隐藏”超类中的字段,但是两者都存在。
隐藏字段是非常糟糕的做法,但是可以:
public class HideField {
public static class A
{
String name = "a";
public void doIt1() { System.out.println( name ); };
public void doIt2() { System.out.println( name ); };
}
public static class B extends A
{
String name = "b";
public void doIt2() { System.out.println( name ); };
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.doIt1(); // print a
b.doIt1(); // print a
a.doIt2(); // print a
b.doIt2(); // print b <-- B.name hides A.name
}
}
根据是否重写该方法,访问A或中的字段B。
绝对不要那样做!那永远不是解决问题的方法,它会产生与继承相关的非常细微的错误。
TA贡献1829条经验 获得超4个赞
因为:
可能会破坏parent class代码。例如考虑以下代码(obB.getInt();如果允许实例变量覆盖,则以下代码中的行的行为是什么):
class A
{
int aInt;
public int getInt()
{
return aInt;
}
}
class B extends A
{
int aInt;
public int getInt2()
{
return aInt;
}
public static void main(String[] args)
{
B obB = new B();
//What would be behavior in following line if,
//instance variables overriding is allowed
obB.getInt();
}
}
这是不合乎逻辑的,因为child class应该有/反映所有行为的parent class。
因此,您只能将继承的方法/变量隐藏在中,child class而不能override。
以下是Oracle Java文档的摘录,其中指定了可以执行/期望执行的操作child class:
您可以按原样使用继承的成员,替换它们,隐藏它们,或用新成员补充它们:
继承的字段可以像其他任何字段一样直接使用。
您可以在子类中声明一个与超类中的名称相同的字段,从而将其隐藏(不建议)。
添加回答
举报