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
是什么原因啊
请教 请赐教!!~~~

解决方案 »

  1.   

    System.out.println(a instanceof B); 
    结果是 true 
    那这句话怎么解释啊?
      

  2.   

    现在的a是A的引用 B的对象
    虽然不能调用b1但他确实是一个B对象你可以尝试在B类覆盖a1方法然后调用a.a1();你会发现调用的是B类中的方法
      

  3.   

    在B类覆盖a1方法,然后调用a.a1(),确实是B类中的方法
    但他既然是B对象 为什么不能调用b1呢?
      

  4.   

    System.out.println(a instanceof A);
    看看
    他既是一个B也是一个A,还是一个Object
      

  5.   

    a 现在是A 的引用 他是不是指向对象b啊?
      

  6.   

    instance of是判断一个object是不是属于某个类的
    a没有B的方法
      

  7.   

    多态呀。
    1.a实际上就是B类的对象,所以System.out.println(a instanceof B); 结果是 true。
    2.在程序里,你做了向上转型,把a当成A来看待,作为调用者的Test3并不知道a实际是什么类型,只能当成A类处理,所以,这时的a就只能调用A类里的方法了。
      

  8.   

    java是强类型语言,每个变量必须有明确的类型,你申明成什么类型就认为是什么类型,而不是根据运行时动态判断。
    既然你a已经申明成A类类型,而A类类型没有a1方法,a.a1()的写法当然不能通过编译了。
    这并不是说不能调用a1方法,而是如果要调用,就要明确地进行强制类型转换,实际上就是告诉编译器,我对a1的类型负责,我知道它就是B。
    这跟long赋值给int要做类型转换是相似的。
    instance of是运行时动态判断,所以是true
      

  9.   

    好了差不多明白了,非常感谢各位 尤其是 lastsweetop