繁体   English   中英

在超类中调用超类方法

[英]Calling superclass method in superclass

我无法找到一个很好的总结来描述我的问题(建议欢迎)

我有以下两个课程:

测试1

import java.lang.reflect.Method;

abstract class Test1 {

    boolean condition = true;

    public void f() {
        System.out.println("Test1 : f");
    }

    public void g() {
        System.out.println("Test1 : g");
        f();
        if (condition) {
            f(); // call Test1.f() here. HOW?

            // Following didn't work
            try {
                Method m = Test1.class.getDeclaredMethod("f");
                m.invoke(this);
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }
}

TEST2

class Test2 extends Test1 {

    public void f() {
        System.out.println("Test2 : f ");
    }

    public static void main(String[] args) {
        Test2 t2 = new Test2();
        t2.g();
    }

}

输出是:

Test1 : g
Test2 : f
Test2 : f
Test2 : f

问题是由于Test1condition字段给出了一些特殊条件,我想在g()调用Test1f() ,即使我使用Test2的对象进行调用。

我尝试过反射但它也不起作用。 有什么建议?

编辑1:我没有具体提到它,但如果你仔细看,Test1是抽象的。 所以我无法创建它的对象。

您应该认真考虑您要构建的逻辑。 您尝试覆盖子类中的方法f的原因确定了它背后的原因。

或者,您可以将boolean值作为方法f的返回值,并在子方法中使用boolean r = super.f(); if(r){//execute child logic.} boolean r = super.f(); if(r){//execute child logic.}这应该可以解决你的问题。

我的理解。

你的问题:
如果g()Test1类中调用方法f()那么为什么它运行子(Test2)类的f()

答案:来自JLS-8.4.8.1

子类Test2声明了一个方法f() ,它覆盖了Test1的方法f() 它继承了Test1类中的方法g()

关于这个例子中覆盖的关键点是,在类Test1中声明的方法g()调用当前对象this定义的f()方法,该方法不一定是类Test1中声明的f()方法。

因此,当g()是在主要使用的Test2对象T2,的调用调用f()在体g()方法是的调用f()对象T2的。 这允许Test1的子类改变f()方法的行为而不重新定义它。

震荡:

因此,如果某个类覆盖其父级的某些方法,那么契约说,设计为扩展的Test1应该清楚地指出该类与其子类之间的契约,并且应该清楚地表明子类可以覆盖f()方法通过这种方式。

在Test1中添加方法f2:

private void f2() {
    System.out.println("Test1 : f");
}
public void f() {
    this.f2()
}

这样,当条件为真时,您可以调用f2()。

如果方法名称相同,则无法执行此操作。
其他方法可以通过使用super.f()直接在子类中调用超类方法。

UPD:特别针对那个不太注意的人,我正在给出解释。

在下面的代码中,我使用方括号{ }创建新的匿名类。 这允许我创建子类Test1新实例。


而不是使用reflection你可以做这样有趣的事情:

public void g() {
    System.out.println("Test1 : g");
    f();
    if (condition) {
         new Test1(){}.f();
    }
}

唯一的缺点是f()方法调用这种方式是绝对另一个对象的方法的调用。

继承只允许您继承super.f()行为,覆盖它@Override或两者

@Override
public void f(){
    super.f(); 
    //do something  
}

你不能覆盖一个方法,然后尝试在覆盖之前调用parents方法状态。 继承不是那样的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM