不在机器上跑,看你能得出正确答案吗?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();
}}
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();
}}
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");
}
这方法
原因是错误的理解了 super 的概念
public void Testa() {
super.Testa();//声明调用父类的Testa方法
}这句就是使用父类的Testa()方法,但是还是在TestB类中使用的。
所以是上面这结果
new了一个子类TestB()的对象,然后调用类中的Testa()方法,相当于:
TestB t = new TestB();
t.Testa();最后到底是调用了哪个Testb()?由动态绑定和多态性可得,因为new的是子类的对象,所以调用了子类的Testb()
故结果为:B->Testb
B->Testb
1.对命名规则不尊重。
2.new TestB().Testa();这是程序员能写出来的?
子类覆盖父类中的同名方法
1.执行TestB对象中的Testa方法。
2.TestB对象中的Testa方法执行super.Testa();
3.调用Testb方法。首先看自己有定义就执行本身的Testb即System.out.println("B->Testb");
结果output:
B->Testb
你这么说我想起来了,那个调用init和这个是一样的道理.