“重要的是要理解,引用变量的类型(而不是它所引用的对象的类型)决定了可以访问哪些成员。”
那句话你到底是什么意思?这仅限于继承概念吗?JVM如何处理它?
这意味着假设您具有:
Object x = "hello";
的类型的 变量 是Object,但对象的类型是指是String。这是变量类型,它决定了您可以执行的操作-因此您无法调用
Object
String
// Invalid String y = x.toUpperCase();
编译器仅知道您在上调用方法Object,其中不包括toUpperCase。同样,重载方法仅针对您所知道的方法进行解析:
toUpperCase
public class Superclass { public void foo(Object x) {} } public class Subclass extends Superclass { public void foo(String y) {} } ... Subclass x = new Subclass(); Superclass y = x; x.foo("hello"); // Calls Subclass.foo(String) y.foo("hello"); // Calls Superclass.foo(Object)