不在机器上跑,看你能得出正确答案吗?package com.test.inherit;class TestA { public void Testa() {
Testb();
} public void Testb() {
System.out.println("A->Testb");
}
}public class TestB extends TestA { @Override
public void Testa() {
super.Testa();
} @Override
public void Testb() {
System.out.println("B->Testb");
} public static void main(String[] args) {
new TestB().Testa();
}}

解决方案 »

  1.   

      System.out.println("B->Testb");
      

  2.   


    package com.test.inherit;class TestA {    public void Testa() {
            Testb();//声明会调用Testb()的方法,但具体是哪个实例去实现,没说明
        }    public void Testb() {
            System.out.println("A->Testb");
        }
    }public class TestB extends TestA {    @Override
        public void Testa() {
            super.Testa();//声明调用父类的Testa方法
        }    @Override
        public void Testb() {
            System.out.println("B->Testb");
        }    public static void main(String[] args) {
            new TestB().Testa();//创建一个TestB的实例,然后调用Testa()方法,如果这方法TestB存在(也可以说是覆盖的方法),那么就调用TestB的Testa方法,否则调用TestB父类的方法,如果父类都不存在,编译不过
        }}
    其实说来说去就是多态问题,这题现在是new了一个TestB的实例,所以实际上会调用
        @Override
        public void Testb() {
            System.out.println("B->Testb");
        }
    这方法
      

  3.   

    我做错了~~~
    原因是错误的理解了 super 的概念
      

  4.   

    B->Testb子类覆盖了父类的方法,执行时候会调用子类的方法。就像Action,我们定义的Action继承了Action同时你可以选择覆盖execute方法,如果你覆盖了,那么每次调用都会根据你的定义来执行execute,如果没有覆盖则自动执行父类的该方法。虽然在B的Testa方法内调用父类的方法,但是必须说明,这方法本身已经是覆盖了,只是方法实现跟父类相同,实现的过程是调用Testb方法,同样Testb方法也已经覆盖了,所以执行子类也就是B的Testb方法。
      

  5.   

    简单的说这是一个TestB的实例,肯定执行的是TestB里面的方法~~
      

  6.   


     public void Testa() {
            super.Testa();//声明调用父类的Testa方法
        }这句就是使用父类的Testa()方法,但是还是在TestB类中使用的。
    所以是上面这结果
      

  7.   

    初始化的时候应该是先执行父类的方法再执行子类的方法,在这里父类的Testb() 被子类覆盖了。所以就是调用子类的方法了。
      

  8.   

    有意思,让我想起了Servlet,恩好像是HTTPServlet吧,当时我们老师讲说可以只重写它无参的init()方法,就可以做我们自己想做的一些初始化工作,当时觉得没什么啊,的确是应该是这样的,父类中有参的init()中调用过父类中自己的无参init()方法就可以调到我们在子类中重写过的无参init()方法.看了这道题才知道,原来那时并没有真的理解,现在是真的明白了.学习了! 谢谢lz
      

  9.   

    new TestB().Testa(); 
    new了一个子类TestB()的对象,然后调用类中的Testa()方法,相当于:
    TestB t = new TestB();
    t.Testa();
    最后到底是调用了哪个Testb()?由动态绑定和多态性可得,因为new的是子类的对象,所以调用了子类的Testb()
    故结果为:B->Testb
      

  10.   

    这个没啥好说的啊
    B->Testb
      

  11.   

    出题的小学生水平,看见这题还不直接跑人?
    1.对命名规则不尊重。
    2.new TestB().Testa();这是程序员能写出来的?
      

  12.   

    B->Testb
    子类覆盖父类中的同名方法
      

  13.   

    类的方法执行首先找自己定义的,没有找到找父类,知道object类,如果还没有找到就抛java.lang.NoSuchMethodError异常。new TestB().Testa();
    1.执行TestB对象中的Testa方法。
    2.TestB对象中的Testa方法执行super.Testa();
    3.调用Testb方法。首先看自己有定义就执行本身的Testb即System.out.println("B->Testb");
    结果output:
    B->Testb
      

  14.   

    别把super当成事,反正只要没有产生父类对象,调用的都是子类的方法(如果父类的方法被子类覆盖)
      

  15.   


    你这么说我想起来了,那个调用init和这个是一样的道理.