关键词super
不“粘”。每个方法调用都是单独处理的,所以即使你必须SuperClass.method1()
通过致电super
,这不会影响您将来可能进行的任何其他方法调用。
这意味着没有直接的方法来调用SuperClass.method2()
from SuperClass.method1()
不去SubClass.method2()
除非您正在使用的实际实例SuperClass
.
您甚至无法使用 Reflection 达到所需的效果(请参阅的文档java.lang.reflect.Method.invoke(Object, Object...)).
[EDIT]似乎还是有些混乱。让我尝试一个不同的解释。
当你调用foo()
,你实际上调用了this.foo()
。 Java 只是让你省略this
。在问题的示例中,类型this
is SubClass
.
所以当Java执行代码时SuperClass.method1()
,最终到达this.method2();
Using super
不改变指向的实例this
。所以电话转到SubClass.method2()
since this
属于类型SubClass
.
也许当你想象Java通过时更容易理解this
作为隐藏的第一个参数:
public class SuperClass
{
public void method1(SuperClass this)
{
System.out.println("superclass method1");
this.method2(this); // <--- this == mSubClass
}
public void method2(SuperClass this)
{
System.out.println("superclass method2");
}
}
public class SubClass extends SuperClass
{
@Override
public void method1(SubClass this)
{
System.out.println("subclass method1");
super.method1(this);
}
@Override
public void method2(SubClass this)
{
System.out.println("subclass method2");
}
}
public class Demo
{
public static void main(String[] args)
{
SubClass mSubClass = new SubClass();
mSubClass.method1(mSubClass);
}
}
如果你跟踪调用堆栈,你可以看到this
永远不会改变,它始终是创建的实例main()
.