这与java中的超级关键字之间的区别(更高级的信息)
我知道这个关键字用于调用特定类中的当前构造函数。但我有另一种情况,我需要更多地了解它。下面的代码显示了此关键字和超级关键字的用法:这与java中的超级关键字之间的区别(更高级的信息),java,keyword,Java,Keyword,我知道这个关键字用于调用特定类中的当前构造函数。但我有另一种情况,我需要更多地了解它。下面的代码显示了此关键字和超级关键字的用法: public class Stack { public void push() { /* do something */ } public boolean full() { /* do something */ } } 另一类是: public class ProtectedStack
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();
}
}
}
我想知道在这种情况下会发生什么。这是非常明确的
this
在当前对象上调用的方法,而super
在当前对象的父对象上调用的方法(注意在调用过程中,该方法以递归方式搜索,直到找到为止)
从注释中可以看出,在您的情况下,由于您没有对子类
this.full()
和full()
实现full()
和super.full()
是相同的
另外,由于this.full()
和full()
总是一样的,所以不要使用this.full()
模式来减少混淆 此.full()
与full()
完全相同。它在ProtectedStack
实例上调用方法full()。此方法可以直接在ProtectedStack
类中声明,也可以继承。在代码中,方法full()
似乎是从父类Stack
继承的,因为ProtectedStack
不会覆盖它
关于super.push()
,这将始终调用在最近的父类中实现的方法push()
。即使在ProtectedStack
中重写此方法,也会调用父方法
基本上:
this.method()
:对该对象调用方法method()
,因此在该类中搜索该方法,然后在父类中搜索该方法,等等。如果该类重写该方法,则将调用该方法。如果没有,将调用来自父级的,等等
super.method()
:始终调用父类的方法method()
,即使该类重写了它
super.someMethod()
调用你所扩展的类中的方法someMethod()
,我正在谈论这个关键词,在这个例子中它有不同的情况,我需要理解。值得一提的是,关键字this
在这个上下文中是不必要的是,我知道,但在本例中,this.full()函数尝试调用父类中的full方法,因为当前类中没有它的实现。我在这里看到,在这种情况下,这个关键字充当超级关键字。这是一个递归过程:如果当前类的父类
没有所讨论的方法,编译器将查找父类
的父类
,依此类推。如果没有更多的Parent
(即如果到达对象
),并且找不到该方法,您将得到一个语法错误。我应该提到,如果有对super(…)
的显式调用,则它必须是该方法的第一条指令。@douny不在此上下文中<调用构造函数时,code>super()
必须是第一条指令,而不是方法。我的错,很抱歉精度不够