Java继承领域

DHS:

我无法理解下面的输出。

我不知道为什么输出是10,我觉得行A a = new B()创建B类的新实例,我想结果应该是20

class A {
    int i = 10;
}

class B extends A {
    int i = 20;
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();

        System.out.println(a.i);
    }
}

为什么这是这样的..请解释一下。

cricket_007:

首先,看看隐藏字段(强调)

在一类,具有相同的名称作为超一个字段的字段皮超类的领域,即使它们的类型是不同的

换句话说,这是不是“遗产”,因为你实际上隐藏Ai背后Bi,和你正在使用的参考对象A,所以你得到它的领域。如果你这样做B b = new B(),你会看到20,符合市场预期。


如果你希望真正覆盖,尝试使用方法。

class A {
    public int get() { 
        return 10; 
    }
}

class B extends A {
    @Override 
    public int get() { 
        return 20; 
    }
}

看到

A a = new B();
System.out.print(a.get()); // 20

如果你真的想看到两者兼而有之,看到这个例子。

class A {
    int i = 10;
}

class B extends A {
    int i = 20;

    @Override 
    public String toString() { 
        return String.format("super: %d; this: %d", super.i, this.i);
    }
}

A a = new B();
System.out.print(a); // super: 10; this: 20

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章