Java转换问题

时间:2018-11-22 13:41:38

标签: java

我有以下代码

public class Main {
    public static void main(String[] args) {
        Parent upCasted = new Child();
        System.out.println("String: " + upCasted.getString());
        System.out.println("Int: " + upCasted.a);
    }
}


class Parent {
    int a = 1;

    public String getString() {
        return "Parent";
    }
}

class Child extends Parent {
    int a = 2;

    @Override
    public String getString() {
        return "Child";
    }
}

当我运行它时,我会在控制台中看到它

String: Child
Int: 1

为什么在向上转换期间,int的值是从Parent取而String的值是从Child?

1 个答案:

答案 0 :(得分:3)

这是因为在子类中重新声明实例字段时不会覆盖。

相反,当评估upCasted.a时,Java会查看upCasted的静态/声明类型来知道要读取哪个类的字段(而不是在upCasted对象的运行时类中)指向)。

这就是为什么在超类和子类中的字段不应该使用相同的名称的原因。