我对Java中的类型转换有一个问题如下:
假设我有一个班级:
class A { public void m() }
现在我做了:
A a1 = new A(); // (1)
a1.m(); // (2)
Object o = new A(); // (3)
o.m(); // (4)
我们可以将第(1)行称为:a1
包含新对象A()
的内存地址(在Heap中创建)。所以第(2)行绝对可以。
我们也可以将第(3)行说成:o
包含新对象A()
的内存地址(也是在Heap中创建的)。但是行(4)显然无法编译,因为Object类没有m()方法。
但为什么a1
包含对象A()
的地址,并且“可以看到”m()
方法;虽然o
也包含对象A()
的地址,但它“看不到”m()
方法?
还有其他解释吗? (Object
类没有m()
方法的原因除外)。
谢谢大家。
答案 0 :(得分:7)
Object
类没有m()
方法
那是 的解释。这些东西在编译时验证。想象一下:
Object o1 = new A();
Object o2 = new String();
void doSomething(Object o) {
o.m(); // compilation error
}
现在,A
有m()
,但String
却没有。这由编译错误表示。如果Java不是statically typed,则此错误将在运行时出现。并且认为发现问题越早越好。