我知道这个关键字用于调用特定类中的当前构造函数。但我有另一种情况需要更多地了解它。下一个代码显示了这个和超级关键字的使用:
public class Stack {
public void push()
{
/* do something */
}
public boolean full()
{
/* do something */
}
}
,另一个类是:
public class ProtectedStack extends Stack {
public void push()
{
if (this.full()){----}
else
{
super.push();
}
}
}
我想知道在这种情况下会发生什么。
答案 0 :(得分:2)
this.full()
与full()
完全相同。它在full()
实例上调用方法ProtectedStack
。此方法可能可以直接在ProtectedStack
类中声明,也可以继承。在您的代码中,看起来方法full()
是从父类Stack
继承的,因为ProtectedStack
不会覆盖它。
关于super.push()
,这将始终调用在最近的父类中实现的方法push()
。即使在ProtectedStack
中覆盖了此方法,也会调用父方法。
基本上:
this.method()
:在此对象上调用方法method()
,因此在此类中搜索该方法,然后在父类等上搜索该方法。如果此类覆盖它,那么这个将是调用。如果没有,将调用父母的那个,等等。super.method()
:始终调用父类的方法method()
,即使此类重写它也是如此。答案 1 :(得分:1)
非常明确this
调用当前对象的方法,而super
调用当前对象的父方法(注意在调用期间方法是以递归的方式搜索,直到找到它。)。
来自评论,在您的情况下,因为您没有在子类full()
上实现this.full()
方法,full()
和super.full()
是相同的
同样,this.full()
和full()
始终相同,请勿使用this.full()
模式以尽量减少混淆。