超级和这个的可替代性

时间:2012-11-28 13:34:29

标签: java inner-classes

我已经了解了superthis在Java中的可替代性,因此super的引用在this合法的地方是合法的超类(除了Object类的代码,其中super不能出现)。当我把它放到测试时它似乎失败了,如下例所示:

class OuterSuper {
  public int oneNumber() { return 5; }
  class Inners {}
  int i1 = OuterSuper.this.oneNumber();
  OuterSuper.Inners si1 = OuterSuper.this.new Inners();
}
class Outer extends OuterSuper {
  class Inner {
    int i1 = Outer.this.oneNumber();
    int i2 = Outer.super.oneNumber();
    OuterSuper.Inners si1 = Outer.this.new Inners();
    OuterSuper.Inners si2 = Outer.super.new Inners();
  }
}

编译器在成员si2的最后一个声明处出现。在这个例子中,我能够为int i1和i2编写声明,它就像规范说的那样,我可以替换我传递给super的任何东西,在超类中。对于内部阶级,我被困住了,必须使用它。这是不同的吗?我在两个实例中都在写“Outer.this”和“Outer.super”......

我想分享一下,我正在使用javac(来自Oracle 1.6的命令行JDK)和NetBeans。我从javac得到的错误是:

Exe.java:32: <identifier> expected
        OuterSuper.Inners si2 = Outer.super.new Inners();
                                            ^
Exe.java:32: invalid method declaration; return type required
        OuterSuper.Inners si2 = Outer.super.new Inners();
                                                ^
2 errors

3 个答案:

答案 0 :(得分:1)

所以,这是我的两分钱。我的印象是super只能在类中用于引用它自己的基类。我认为即使给出内部阶级关系,也不允许引用另一个类'super。这是因为没有其他类本身应该能够绕过方法覆盖。

因此,根据Java规范:

  

如果当前类不是类T或T本身的内部类

,则是编译时错误

鉴于此,您的代码应该编译。

答案 1 :(得分:0)

也许您应该在这两行上使用Outer而不是OuterSuper

class Outer extends OuterSuper {
  class Inner {
    int i1 = Outer.this.oneNumber();
    int i2 = Outer.super.oneNumber();
    Outer.Inners si1 = Outer.this.new Inners();
    Outer.Inners si2 = Outer.super.new Inners();
  }
}

答案 2 :(得分:0)

  

在类中对super的引用等同于在超类中引用它

声明完全不正确。 super.x()总是引用基类的x()实现,而超类中的this.x()可能引用派生类中的x()重写,如果有的话。