这与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()
必须是第一条指令,而不是方法。我的错,很抱歉精度不够