代码如下:
class MyTest
{
public void myTest(){
System.out.println("Printing myTest in MyTest class");
}
public static void myStat(){
System.out.println("Printing myStat in MyTest class");
}
}public class Test extends MyTest{
public void myTest(){
System.out.println("Printing myTest in Test class");
}
public static void myStat(){
System.out.println("Printing myStat in Test class");
}
public static void main(String args[]){
MyTest mt = new Test();
mt.myTest();
mt.myStat();
}
}这是SCJP的一道题,答案是
Printing myTest in Test class
Printing myTest in MyTest class上机验证没错,我想不通的是为什么不是两个“Printing myTest in MyTest class”?
象“MyTest mt = new Test();”这种用法声明为父类但“new”为子类到底有何奥妙之处?

解决方案 »

  1.   

    晕了
    怎么感觉答案
    Printing myTest in Test class
    Printing myTest in MyTest class
    是不正确的呢
      

  2.   

    差别在static
    ---------------
    正解!
    java中所有方法除用static声明外均为动态绑定,因此MyTest mt = new Test();当调用非static方法时动态寻找属于自己类的方法,而调用static方法时只能调用你向上转型的类的方法。
      

  3.   

    Printing myTest in Test class
    Printing myStat in MyTest class
    由于重写的方法是静态的
    在运行的时候,无论有多少个继承MyTest类的对象都使用内存中的同一块方法区域
    编译是一回事,运行是另一回事
      

  4.   

    编译是一回事,运行是另一回事
    ---------------
    高见高见
    编译时两个方法都是调用的父类的,但是实际运行时有一个却调用了子类的方法。
    不信大家把子类的那两个方法注释掉也可以编译通过,但运行结果就是两个Printing myStat in MyTest class了。“在运行的时候,无论有多少个继承MyTest类的对象都使用内存中的同一块方法区域”
    这个区域只会保存父类的静态方法而不会被子类改写吗?
      

  5.   

    关键在于static方法不能被继承
    楼主的例子第二个方法不存在动态绑定的问题,而是调用父类的方法,因为它本身声明就是父类的
      

  6.   

    怎么可能是两个Printing myTest in MyTest class呢?
    第一个输出Printing myTest in Test class是多态,应该好理解吧,不多说了
    第二个输出Printing myTest in MyTest class是因为那个函数是static的 ,static的东西都只有一份,而 mt 已经被向上转型为一个MyTest的对象,当然要调用他自己的函数了。声明一下,static函数不存在重写(override),经管两个函数的名字相同但是他们是两个没有任何关系的函数。楼主明白了吗