日期:2014-05-20 浏览次数:20665 次
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楼的简单的说法
《thinking in Java 》书中说到这是“向上转型的问题”
如果 父类变量 指向 子类对象实例
那么调用父类的变量,调用子类的方法。
------解决方案--------------------
JF
------解决方案--------------------
类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。