java - 访问子类中的重写变量和方法时的差异

标签 java inheritance

根据我的理解,当我们将子对象向上转换为父类的引用时,子对象会丢失与子类相关的特定属性。但是,它仍然可以识别重写的方法和变量。

我的问题是,为什么输出在覆盖方法的情况下显示子类的结果,在覆盖变量的情况下显示父类的结果。为什么方法和变量之间的行为存在如此差异

class A
{
    int a = 2;
    public void show()
    {
        System.out.println("Inside A");
    }
}
class B extends A
{
    int a = 555;
    void show()
    {
        System.out.println("Inside B");
    }
}

class Demo
{
    public static void main(String[] args)
    {
        A obj = new B();
        System.out.println(obj.a); // prints 2. 
        obj.show();  // prints Inside B
    }
}

最佳答案

因为你的理解是错误的。 Java 对象的行为与真实对象非常相似。仅仅因为你将 child 称为人类,并不会改变 child 的移动、哭泣和玩耍方式。它还是个 child 。

这就是多态性的全部要点:您可以在不知道对象的具体类型的情况下引用该对象,并且它的行为将按照其具体类型定义中的定义进行。

请注意,多态性和覆盖仅适用于方法,而不适用于字段。字段永远不会以多态方式解析。无论如何,不​​应该从外部直接访问它们:始终通过方法。这是面向对象的另一个主要原则:封装。

在 B 中,您不会覆盖字段 a,而是引入另一个同名字段,该字段隐藏了 A 中定义的字段。

关于java - 访问子类中的重写变量和方法时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17746777/

相关文章:

C++ 多重继承,基类派生自同一个类

java - 带注释的 Spring AOP 方面不适用于基类

java - 如何防止 ResultSet 在连接关闭时失效?

java - 我无法在Mysql Workbench中设置数据类型

java - Rinsim:更改 CommDevice 的范围

java - 露天 : How to filter documents in workflow

inheritance - 如果 Car 是 Vehicle 的子类型,为什么 Vehicle->void 被视为 Car->void 的子类型?

java - 计算 Infinispan 缓存内存大小

c# - C# 中的虚函数

database - 关系数据库建模的正确方法