假设你有一个BlahChild类型的对象,它是BlahParent的扩展,当BlahChild调用super()时会发生什么.omeMethod和someMethod包含对另一个函数的调用,anotherMethod()也在BlahChild中被覆盖?
BlahChild的anotherMethod会被调用,还是BlahParent的另一个方法?
答案 0 :(得分:6)
java中的非静态方法总是virtual,所以是。
来自维基百科:
在Java中,默认情况下所有非静态方法都是“虚函数”。 只有标记为关键字final的方法才能覆盖,不能覆盖私有方法(不是继承的)是非虚拟的。
它会调用BlahChilds
实现。
class Parent {
public void method() {
System.out.println("Parent: method");
someOtherMethod();
}
public void someOtherMethod() {
System.out.println("Parent: some other");
}
}
class Child extends Parent {
@Override
public void method() {
System.out.println("Child: method");
super.method();
}
@Override
public void someOtherMethod() {
System.out.println("Child: some other");
}
}
public class Test {
public static void main(String[] args) {
new Child().method();
}
}
Child: method
Parent: method
Child: some other // <-- Child.someOtherMethod gets called, from Parent.method
答案 1 :(得分:3)
你应该为这些问题发布具体的代码。
但是,根据您的描述,听起来anotherMethod()
是虚拟的(即非最终的),对象是BlahChild
,因此BlahChild
中被覆盖的版本应该被调用
你为什么不自己测试一下?
答案 2 :(得分:2)
将调用子类中重写的方法。
超级()。的someMethod
那甚至都不会编译。你可能意味着super.someMethod()
,也许让你感到困惑的是super
返回类似“隐藏的超类实例”之类的想法,然后在该实例上调用该方法。哪有这回事。方法调用基本上是一个对象的消息,说“请执行具有此名称的代码段”,然后该对象查看其类以查看代码段。 super
只是一种使对象看到它的超类的方法,这在概念上是不干净的,但通常非常有用,因为许多重写方法需要它们覆盖的方法的功能(并在之前和/或之后做一些额外的事情)
答案 3 :(得分:0)
我讨厌以下示例,因为这些方法是虚拟调用,所以super方法调用子类中的方法:
检查here以获取解释
以便运行示例产生:
child: test1 // call to child.test1()
child: test2 // child test2() gets called
super: test1 // call to super.test1()
child: test2 // child.test1 gets called
示例代码:
package de.congrace.doodles;
public class ChildClass extends SuperClass {
@Override
public void test1() {
System.out.println("child: test1");
test2();
}
@Override
public void test2() {
System.out.println("child: test2");
}
private void callSuperTest() {
super.test1();
}
public static void main(String[] args) {
ChildClass c=new ChildClass();
c.test1();
c.callSuperTest();
}
}
package de.congrace.doodles;
public class SuperClass {
public void test1() {
System.out.println("super: test1");
test2();
}
public void test2() {
System.out.println("super: test2");
}
}