java - 方法的继承与变量的继承有何不同?为什么?

标签 java inheritance

在准备 OCJP 考试时,我偶然发现了一个我无法全神贯注的问题。这是(由我稍微修改)来自一个问题的代码:

class Foo {
    public int a = 3;
    public void addFive() {
        a += 5;
        System.out.print("f ");
    }
}

class Bar extends Foo {
    public int a = 8;
    public void addFive() {
        a += 5;
        System.out.print("b ");
    }
}

public class TestInheritance {
    public static void main(String [] args) {
        // part 1
        Foo f = new Bar();
        f.addFive();
        System.out.println(f.a);

        // part 2
        Bar b = new Bar();
        b.addFive();
        System.out.println(b.a);
    }
}

输出是:

b 3
b 13

第 2 部分我可以理解。这里没有什么奇怪的。但是第 1 部分不让我晚上 sleep 。我明白为什么 Bar.addFive 运行了,但为什么在第 1 部分 f.a 打印 Foo.a 当我使用 new Bar() 来实例化一个对象?看起来继承对方法的工作方式与对变量的工作方式大不相同。我在这里缺少什么来理解这个概念?我失败了什么?

最佳答案

It looks like inheritance works quite different for methods then for variables.

更准确地说,继承不会使变量多态。当您声明相同的方法时,派生类中的方法会覆盖基类中的方法。当您声明一个相同的变量时,基类中的变量被派生类中的变量隐藏。

在您的示例中,Bar有两个变量 a , 但只有一种方法 addFive() .本质上,每个 Bar对象包含两个整数 - Foo.aBar.a .这两个是独立的变量。然而,addFive方法是在 Bar 中定义的方法,因为它覆盖(替换)addFive来自 Foo .

请注意,Java 让 Bar访问Foo.addFive调用super.addFive() , 但 Bar 的用户缺乏这种可能性。

关于java - 方法的继承与变量的继承有何不同?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842116/

相关文章:

java - 子类可以从已经实例化的父类(super class)实例化吗?

java - Spring 数据 JPA( hibernate ): How do I retrieve a concrete entity using only a field in its abstract superclass?

java - 在 Java 中声明一个父类(super class)变量,然后用子类实例化它

java - 在java中,动态分配

java - Spring:按名称获取内联bean

java - 使用 HP LeanFT 与已打开的浏览器交互

java - 使用 Java 泛型、接口(interface)和继承的不兼容性

c++ - C++ 中的动态内存和继承结构

java - 为什么这个 split() 会失败?

java - 如何最好地比较 Java 中的两个集合并对其采取行动?