有谁能帮我解决下面程序吗?
我对输出结果实在是不明白,输出结果是:1 2
那位看懂了的能不能帮我解释这行代码: J_Base app=new J_Test(); 
class J_Test extends J_Base

 
public   int m_data=3; 
    public String mb_method() 
  
  {
    return "2";
                            } 
public static void main(String args[])
  
  { 
 
 J_Base app=new J_Test(); 
 System.out.println(app.m_data);
 System.out.println(app.mb_method()); 
  
                            } 
                                                }    class J_Base
    
    { 
        public int  m_data=1; 
    public String mb_method() 

   {
   return "3";
                            } 
                                           }

解决方案 »

  1.   

    J_Base app=new J_Test();  
    父类变量对匿名子类对象的引用。
    app.m_data此时,子类的public   int m_data=3;还没有被执行。所以继承父类的m_data,值为1,
    System.out.println(app.mb_method());因为子类覆盖了父类的mb_method()方法,而app是对子类对象的引用,还有多态的关系,所以他调用的是子类的mb_method()方法。这个时候m_data被赋值为2。
      

  2.   

    晕,最后一句错了m_data不是被赋值为2,而是mb_method()方法返回了一个字符串2。
      

  3.   


    class J_Test extends J_Base //因为J_Test 是J_Base的子类,
    {  
      
    public   int m_data=3;  
        public String mb_method()  
       
      { 
        return "2"; 
                                }  
    public static void main(String args[]) 
       
      {  
      
     J_Base app=new J_Test();  /*所以可以用基类的变量引用子类的对象,这是Java的一种称为多态的机制,你可以看一些相关的书籍或资料*/
     System.out.println(app.m_data);/*这里有些麻烦,和java的命名有关,app虽然是子类,但可以看到与其同名的基类的成员,此时(子类当作基类用)它就将基类的同名成员输出了*/
     System.out.println(app.mb_method()); /* 此时的方法的调用是更具对象的具体类型调用,app是J_Test类,所以此处的mb_method()的方法是J_Test类中的方法*/
       
                                }  
                                                    }     class J_Base 
         
        {  
            public int  m_data=1;  
        public String mb_method()     { 
       return "3"; 
                                }  
                                               } 
      

  4.   

    赞同4楼的简单的说法《thinking in Java 》书中说到这是“向上转型的问题”如果 父类变量 指向 子类对象实例那么调用父类的变量,调用子类的方法。
      

  5.   

    类J_Test继承了J_Base,初始化时,将J_Base app初始化为他的一个子类型。
    因为子类自动继承了父类的属性和方法,所以System.out.println(app.m_data);返回1。
    而在子类中重写了父类方法public String mb_method();故System.out.println(app.mb_method());要执行子类的方法,而子类方法返回2,所以最终输出1和2。
      

  6.   

    首先是方法的重写,所以调用mb_method()时就是子类的方法了。
    至于域是由于两个变量名称一样,所以当你的引用是哪个类型它就用那个类中的域,
    其实你也可以在子类中使用父类中的域,只要你把其中一个域的名字改一下。