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对 引用有着什么样的作用? 是一种强制转换作用吗?
如果是一种强制转换的过程,为什么会丢失新增的方法呢?难道 这种子父类的转换 其核心是接口的形式吗? 上转型对象和 接口回调 难道他们的核心 都是 以接口的形式返回对象吗?
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对 引用有着什么样的作用? 是一种强制转换作用吗?
如果是一种强制转换的过程,为什么会丢失新增的方法呢?难道 这种子父类的转换 其核心是接口的形式吗? 上转型对象和 接口回调 难道他们的核心 都是 以接口的形式返回对象吗?
问题续: “A a 引用的数据类型A对 引用有着什么样的作用? 是一种强制转换作用吗? ”有两点好处: 传参灵活方便,多态是抽象化的基础(接口).
看下这个文章吧
http://blog.csdn.net/java_cxrs/archive/2008/11/17/3315664.aspx
你的意思是,在JVM里面,方法的执行顺序是 从父类开始,然后接着是子类这样吗?
我是想知道,上转型对象在运行时是怎么样进行方法匹配的操作的
我通过了解了一下,他确实是涉及到了“ 后期绑定”的一个概念,在运行时去绑定方法的主体,
可惜,但是本人对 动态绑定 了理解也不是很深,
有点像强制转换,但是new B()创建的对象都依然存在,再把a赋给一个B类型的就又能引用func3()
上转型对象关注的是子类继承父类的东西以及重写的东西,子类独有的东西被忽略了
可是B确实有fun() 为什么掉用不了;
这时 你就要用到反射
a.getClass().getMethod("func3",null).invoke(a, null);