我有一段程序,我看不懂,结果为什么是 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();
看不懂?帮助解释一下。谢谢

解决方案 »

  1.   

    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类中复写后的方法
      

  2.   

    相当于J_Base a = new J_Test15();
    a.mb_method();现在明白了吧! PS:这种JAVA代码风格不太好,又是大小写, 又是下划线.
      

  3.   

    程序没有问题
    结果就应该是:“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”。
      

  4.   

    我还有问题请教
    class J_Base{
      public int m_data=1;
      public String mb_method()
      {return “2”;}
    }
    class J_Test extends J_Base{
      public int m_data=3;
      public String mb_method() {return “4”;}
      public static void main(String args[]){
    J_Base app=new J_Test(); System.out.println(app.m_data+app.mb_method());
    }
    }
    结果为:14
    我觉得结果为方34.
    app.m_data调用的是子类J_Test的变量m_data,结果为3.为什么?
      

  5.   

    我也不懂J_Base app=new J_Test();  //app指向的是子类的对象,那么调用的方法是子类继承下来的父类方法,那么为什么调用的成员变量却是父类的呢