当使用super()。方法时,在这种情况下调用哪些方法

时间:2010-06-25 08:56:35

标签: java

假设你有一个BlahChild类型的对象,它是BlahParent的扩展,当BlahChild调用super()时会发生什么.omeMethod和someMethod包含对另一个函数的调用,anotherMethod()也在BlahChild中被覆盖?

BlahChild的anotherMethod会被调用,还是BlahParent的另一个方法?

4 个答案:

答案 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");
    }
}