我是在引用java语言规范来理解超级语言的使用。虽然我理解第一个用例,即
表单
super.Identifier引用当前对象的名为标识符的字段,但将当前对象视为当前类的超类的实例。
我似乎无法理解以下用例:
表单
T.super.Identifier引用与T对应的词汇包围实例的名为标识符的字段,但该实例被视为T超类的实例。
有谁能用密码来解释一下吗?
我认为以下可以说明第二种情况:
class S{
int x=0;
}
class T extends S{
int x=1;
class C{
int x=2;
void print(){
System.out.println(this.x);
System.out.println(T.this.x);
System.out.println(T.super.x);
}
}
public static void main(String args[]){
T t=new T();
C c=t.new C();
c.print();
}
}产出:2 1 0
发布于 2013-09-21 16:14:00
我相信这也适用于这种情况
public class Main {
static class Child extends Parent{
class DeeplyNested {
public void method() {
Child.super.overriden();
}
}
public void overriden() {
System.out.println("child");
}
}
static class Parent {
public void overriden() {
System.out.println("parent");
}
}
public static void main(String args[]) {
Child child = new Child();
DeeplyNested deep = child.new DeeplyNested();
deep.method();
}
}在JLS中
表单T.super.Identifier引用与T对应的词汇包围实例的名为标识符的字段,但将该实例视为T的超类的实例。
Identifier是overriden,这个方法。
这里,lexically enclosing instance是Child类型的,它的超类是Parent。因此,T.super引用被视为Parent的Child实例。
以上代码打印
parenthttps://stackoverflow.com/questions/18934545
复制相似问题