我有两个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()
之间有什么区别(在这种情况下)?
答案 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
中没有重写方法,但是如果当前this
是bar
的子类的实例,假设为baz
,它会覆盖该方法,调用类baz
的方法。
换句话说,调用this.foo_func()
仍将动态调用this
实际类的最具体方法,就像不使用this.
相反,super.foo_func()
确实需要从超类继承的方法foo_func()
,因此会影响方法调度,因为当前类及其子类中的重写方法将被忽略。但即使这样,如果你有一个超类链,其中多个类定义了该方法,那么将调用最具体的一个,你不能选择一个特定的方法。
答案 2 :(得分:0)
没有区别。子类bar
只是简单地调用父foo's
方法。除非您决定覆盖它,否则foo_func()
属于foo。