class A {
public void a1() {}
}
class B extends A {
public void b1() {}
}
public class Test3{
public static void main(String[] args) {
B b = new B();
A a = (A)b;
System.out.println(a instanceof B);
}
}A a = (A)b;
System.out.println(a instanceof B);
结果是 true
a不能调用b1
是什么原因啊
请教 请赐教!!~~~
public void a1() {}
}
class B extends A {
public void b1() {}
}
public class Test3{
public static void main(String[] args) {
B b = new B();
A a = (A)b;
System.out.println(a instanceof B);
}
}A a = (A)b;
System.out.println(a instanceof B);
结果是 true
a不能调用b1
是什么原因啊
请教 请赐教!!~~~
结果是 true
那这句话怎么解释啊?
虽然不能调用b1但他确实是一个B对象你可以尝试在B类覆盖a1方法然后调用a.a1();你会发现调用的是B类中的方法
但他既然是B对象 为什么不能调用b1呢?
看看
他既是一个B也是一个A,还是一个Object
a没有B的方法
1.a实际上就是B类的对象,所以System.out.println(a instanceof B); 结果是 true。
2.在程序里,你做了向上转型,把a当成A来看待,作为调用者的Test3并不知道a实际是什么类型,只能当成A类处理,所以,这时的a就只能调用A类里的方法了。
既然你a已经申明成A类类型,而A类类型没有a1方法,a.a1()的写法当然不能通过编译了。
这并不是说不能调用a1方法,而是如果要调用,就要明确地进行强制类型转换,实际上就是告诉编译器,我对a1的类型负责,我知道它就是B。
这跟long赋值给int要做类型转换是相似的。
instance of是运行时动态判断,所以是true