我有一段程序,我看不懂,结果为什么是 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();
看不懂?帮助解释一下。谢谢
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();
看不懂?帮助解释一下。谢谢
a.mb_method();现在明白了吧! PS:这种JAVA代码风格不太好,又是大小写, 又是下划线.
结果就应该是:“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”。
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.为什么?