请参阅下面的代码,其中的方法print
被覆盖,但变量a
没有被覆盖。为什么允许在子类中声明重复的变量?
class B {
int a = 10;
public void print() {
System.out.println("inside B superclass");
}
}
class C extends B {
int a = 20;
public void print() {
System.out.println("inside C subclass");
}
}
public class A {
public static void main(String[] args) {
B b = new C();
b.print(); // prints: inside C subclass
System.out.println(b.a); // prints superclass variable value 10
}
}
为什么在子类方法中不覆盖超类的实例变量,请参见下面的代码…
因为实例变量不能在Java中覆盖。在Java中,只能重写方法。
当你声明一个与超类中现有字段同名的字段时,新字段将隐藏现有字段。超类中的现有字段仍存在于子类中,甚至可以使用…遵守常规的Java访问规则。
因为实例变量在Java中无法被覆盖,但是为什么呢?为什么在Java中以这种方式完成?什么原因?
他们为什么这样设计?
例如:
public class Sup {
private int foo;
public int getFoo() {
return foo;
}
}
public class Sub extends Sup {
private int[] foo;
...
}
如果Sub.foo覆盖(即替换)Sup.foo,如何getFoo()工作?在子类上下文中,它将试图返回错误类型的字段的值!
如果被覆盖的字段不是私有字段,那就更糟了。这将以相当根本的方式打破《里斯科夫可替代性原则》。这就消除了多态性的基础。
在另一面,覆盖领域起不到任何能不能做到更好的在其他方面。例如,一个好的设计将所有实例变量都声明为私有,并根据需要为其提供getter / setter方法。可以覆盖getter / setter ,并且直接使用私有字段或声明getter / setter的父类可以“保护”自身免受不希望的覆盖final。
问题内容: 为什么我们不能覆盖子类中超类的实例变量? 问题答案: 因为如果您更改数据成员的实现,则很有可能会破坏超类(想象将超类的数据成员从float更改为String)。
我正在准备JavaOCA认证,遇到了一个类似的问题,如下所示: 按照Java,实例和静态变量被赋予默认值。令人惊讶的是,我的控制台上显示的错误是: 为什么没有在上面分配默认值?
问题内容: 众所周知,有多种原因(请参阅第一个答案)。为什么只有一个例外涵盖所有这些情况,而不是多个继承自的细粒度情况? 问题答案: 我期望如此,因为发生这种情况时,您实际上什么也做不了:为何耗尽资源几乎无关紧要,因为无论如何您都被搞砸了。也许附加信息会很好,但是… 我知道tomcat会尝试执行“内存不足降落伞”操作,在此过程中,它们会保留一块内存并尝试释放它,但是我不确定它的工作原理。
假设我有一个名为的JPA实体类用于存储照片。我还有另一个名为的非实体类来保存这些计数信息,如、和。现在,如果在实体类中添加一个实例变量()来保存这些状态信息,则会显示以下错误消息: 基本属性只能是以下类型:Java基本类型、基本类型包装器、字符串、Java。数学BigInteger,java。数学BigDecimal,java。util。日期,爪哇。util。日历,java。sql。日期,爪哇。s
我在Java中读到了关于将超类变量类型化为子类的知识,反之亦然。请告诉我哪些是有效的? 动物是超级类,有猫和狗子类。
为什么<code>test