日期:2014-05-20  浏览次数:20718 次

关于继承,程序看不懂
我有一段程序,我看不懂,结果为什么是 Test
class J_Base
{
 public void mb_method()
 {
  System.out.println("Base");
 }
}
class J_Test15 extends J_Base
{
  public void mb_method()
 {
  System.out.println("Test");
 }
 public static void main(String args[])
 {
  Object a=new J_Test15();
  ((J_Base)a).mb_method();
 }
}
结果为 Test
问题: Object a=new J_Test15();
  ((J_Base)a).mb_method();
看不懂?帮助解释一下。谢谢


------解决方案--------------------
Object a=new J_Test15(); a 引用J_Test15(),返回object对象

((J_Base)a).mb_method();将a强制转换为j_base对象,由于j_test15()继承j_base类,故这种调用是正确的,由于最终引用的是j_test15类,故mb_method()方法是j_test15类中复写后的方法
------解决方案--------------------
相当于
Java code

J_Base a = new J_Test15();
a.mb_method();

------解决方案--------------------
程序没有问题
结果就应该是:“Test”
class J_Test15 继承class J_Base ,并且重写了mb_method方法,使之打印“Test”。
如果Object a=new J_Test15(); a.mb_method(); 打印出“Test”相信楼主不会吃惊。
关键的是在调用这个方法之前,对object a进行了强制类型转换,所以楼主就疑惑啦。
先说强制类型转换:因为class J_Test15 继承class J_Base ,所以只要是属于class J_Test15 必然就属于class J_Base 。
举例来说,class 【人】 继承了class 【动物】,那么所有人都属于动物类。
看准实质:虽然进行了一次封装(Object a=new J_Test15(); ),而后又在一定程度上做了拆箱(((J_Base)a)),但是它依然是class J_Test15 的实例,class J_Test15 的对方法mb_method进行重写,优先级高于super class的同名方法,以此仍然是打印出“Test”。

------解决方案--------------------
我也不懂

J_Base app=new J_Test(); //app指向的是子类的对象,那么调用的方法是子类继承下来的父类方法,那么为什么调用的成员变量却是父类的呢
------解决方案--------------------
类型强制转换 父类 -〉 子类