我有以下代码:
1. public class Tester
2. {
3. public static void main(String[] args)
4. {
5. A a = new B();
6. System.out.println(a.getClass()); //Prints class B
7. System.out.println(a instanceof A); //Prints true
8. System.out.println(a instanceof B); //Prints true
9. System.out.println(a.valA); //Prints 1
10. System.out.println(a.valB); //Compilation error
11.
12. }
13. }
14.
15. class A
16. {
17. int valA=1;
18. }
19.
20. class B extends A
21. {
22. int valB=2;
23. }
在第6行,代码显示变量a是B类的类型。然而,在第10行时,编译器会产生错误,提示变量a是A类的类型。所以我的问题是:现在变量a的类类型到底是什么?为什么getClass()方法显示它是B类的类型,但是编译器在编译时抱怨它是A类的类型?此外,由于a instanceof B返回true,为什么我不能访问valB?
更明确地说,我运行了这个语句:System.out.println(a);输出结果是B@36d98810,这证明了class B的toString()方法被执行了。既然变量a可以访问class B中的toString()方法,为什么它不能访问也位于class B中的valB呢?
a
是类型A
,因此它无法推断出它将具有名为valB
的字段。 - August