gpt4 book ai didi

java - 为什么父类(super class)的实例变量不会被子类覆盖?

转载 作者:行者123 更新时间:2023-12-02 05:19:05 25 4
gpt4 key购买 nike

请参阅下面的代码,其中方法 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
}
}

最佳答案

Why instance variable of a superclass is not overridden in subclass method see my code below ...

因为实例变量在 Java 中不能被覆盖。在 Java 中,只能重写方法。

当您声明一个与父类(super class)中现有字段同名的字段时,新字段隐藏现有字段。父类(super class)中的现有字段仍然存在于子类中,甚至可以使用......遵守正常的 Java 访问规则。

(在您的示例中,C 的实例有两个名为 a 的不同字段,包含不同的值。)

<小时/>

Because instance variables CANNOT be overridden in Java, but why? why is it done in this manner in Java? What's the reason?

他们为什么要这样设计?

  1. 因为覆盖变量会从根本上破坏父类(super class)中的代码。例如,如果重写更改了变量的类型,则可能会更改使用原始变量的父类中声明的方法的行为。最坏的情况是,它会使它们无法编译。

    例如:

       public class Sup {
    private int foo;
    public int getFoo() {
    return foo;
    }
    }

    public class Sub extends Sup {
    private int[] foo;
    ...
    }

    如果Sub.foo覆盖(即替换)Sup.foogetFoo()如何工作?在子类上下文中,它将尝试返回错误类型的字段值!

  2. 如果被覆盖的字段不是私有(private)的,情况会更糟。这将从根本上打破里氏可替代性原则(LSP)。这消除了多态性的基础。

  3. 另一方面,覆盖字段不会实现任何其他方式无法实现的效果。更好。例如,一个好的设计将所有实例变量声明为私有(private),并根据需要为它们提供 getter/setter。 getters/setters可以被重写,并且父类可以通过直接使用私有(private)字段或声明 getters/settersfinal来“保护”自身免受不需要的重写。

<小时/>

引用文献:

关于java - 为什么父类(super class)的实例变量不会被子类覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56275810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com