在扩展类中使用此vs super

时间:2014-07-28 16:48:39

标签: java inheritance

我有两个Java类:

public class foo{

    protected int foo_func(){
         //do stuff
    }
}

public class bar extends foo{

    protected void bar_func(){
         x = this.foo_func();
    }
}

(值得注意的是,我没有写这些课程,我在正在研究的项目中看到它们)

现在,当我打开eclipse并查看bar.java类时,我没有看到任何错误。 java编译器不会将此视为问题吗?如果没有,this.foo_func()super.foo_func()之间有什么区别(在这种情况下)?

3 个答案:

答案 0 :(得分:3)

如果课程bar未覆盖foo_func,则this.foo_func()super.foo_func()之间没有区别。

另一方面,如果类bar覆盖foo_func,它可以调用super.foo_func()以执行超类的逻辑以及它自己的逻辑: / p>

public class bar extends foo {

    protected void foo_func(){
         super.foo_func (); // calls the implementation of the super class
         ...
         ... // here you can add more logic specific to bar
    }
}

答案 1 :(得分:0)

虽然this.super.看起来非常相似但却存在很大差异。虽然super.实际上对方法调用有影响,但在大多数情况下,this.限定符根本不会影响代码。具体来说,代码this.foo_func()foo_func()具有完全相同的含义(即没有限定符)。

这意味着在您的代码中,类this.foo_func()中的bar会调用从类foo继承的方法,因为bar中没有重写方法,但是如果当前thisbar的子类的实例,假设为baz,它会覆盖该方法,调用类baz的方法。

换句话说,调用this.foo_func()仍将动态调用this实际类的最具体方法,就像不使用this.

一样

相反,super.foo_func()确实需要从超类继承的方法foo_func(),因此会影响方法调度,因为当前类及其子类中的重写方法将被忽略。但即使这样,如果你有一个超类链,其中多个类定义了该方法,那么将调用最具体的一个,你不能选择一个特定的方法。

答案 2 :(得分:0)

没有区别。子类bar只是简单地调用父foo's方法。除非您决定覆盖它,否则foo_func()属于foo。