class A{
public void func1(){
System.out.println("A func1 is calling");
}

}
class B extends A{
public void func1(){
System.out.println("B func1 is calling");
}
public void func3(){
System.out.println("B func3 is calling");
}
}
public class DouTai { public static void main(String[] args) {
A a=new B();
                a.func3();//此方法不能被执行
}

}
问题: 因为上段代码中 变量 a 是new B()的一个引用地址,所以a引用的是一个子类对象的实例,如果是这样,为什么不能通过a.func3()来调用 方法func3()呢?
问题续: A a  引用的数据类型A对 引用有着什么样的作用? 是一种强制转换作用吗?
如果是一种强制转换的过程,为什么会丢失新增的方法呢?难道 这种子父类的转换 其核心是接口的形式吗?  上转型对象和 接口回调   难道他们的核心 都是 以接口的形式返回对象吗?

解决方案 »

  1.   

    A不知道有func3这个方法,所以不能调用。
      

  2.   

    问题1:“变量 a 是new B()的一个引用地址,所以a引用的是一个子类对象的实例,如果是这样,为什么不能通过a.func3()来调用 方法func3()呢? ”“a引用的是一个子类对象的实例简单”这是简单的认为,在程序执行的时候是这样的。可是当a.func3的时候JVM真正先去A类找是否有这个方法,如果有再看子类是否有重写,再调用重写后的,在A类中他并没有找到func3()这个方法。所以不会调用
    问题续: “A a  引用的数据类型A对 引用有着什么样的作用? 是一种强制转换作用吗? ”有两点好处: 传参灵活方便,多态是抽象化的基础(接口).
      

  3.   

    不是这样用的,
    看下这个文章吧
    http://blog.csdn.net/java_cxrs/archive/2008/11/17/3315664.aspx
      

  4.   

    你好  Mr_Su  
    你的意思是,在JVM里面,方法的执行顺序是 从父类开始,然后接着是子类这样吗?
    我是想知道,上转型对象在运行时是怎么样进行方法匹配的操作的
    我通过了解了一下,他确实是涉及到了“ 后期绑定”的一个概念,在运行时去绑定方法的主体,
    可惜,但是本人对 动态绑定 了理解也不是很深,
      

  5.   

    这里的A a=new B()
    有点像强制转换,但是new B()创建的对象都依然存在,再把a赋给一个B类型的就又能引用func3()
    上转型对象关注的是子类继承父类的东西以及重写的东西,子类独有的东西被忽略了
      

  6.   

    你会发现完了   掉用不了fun();
    可是B确实有fun()   为什么掉用不了;
    这时 你就要用到反射  
    a.getClass().getMethod("func3",null).invoke(a, null);
      

  7.   

    楼主,你在用A a=new B();时,就把B类实例向上转型为A类了.在A类中没有fun3()方法,也就是A类不知道fun3()这个方法.