【问题标题】:Why can't refer interface variables by using super keyword为什么不能使用 super 关键字引用接口变量
【发布时间】:2019-12-31 03:38:45
【问题描述】:

我是 Java 新手,据我所知,通常我们使用 superthis 关键字来引用超类属性。以及我们不能在静态上下文(静态方法)中使用thissuper 关键字。但我有一个问题。我使用了一个匿名类来使用如下接口。我试图从匿名类内部引用number 变量(位于接口中)。但即使它不是静态上下文,我也无法使用 super 关键字来引用数字。问题是什么?。我的代码如下。

    interface Age{
       public static final int number =25;
       public abstract int getAge();
    }

    public class Main {
      public static void main(String[] args) {
        Age age = new Age(){
            public int getAge(){
              int number = super.number;//compile error
              //why cannot use super keyword in here to refer number variable
              return number;
            }
        };
        age.getAge();
      }
   }

【问题讨论】:

  • 我会说那是因为你可以从一个类中实现多个接口,所以super 关键字对于你指的是哪个接口是模棱两可的
  • 你不需要局部变量。只需return number; 不要编写冗余代码。

标签: java oop


【解决方案1】:

super 关键字是指父,而不是任何接口。在您提供的代码中,Age 是一个接口。无论您查看的是匿名类还是命名类,您都会看到相同的行为。

如果您想知道为什么语言设计者决定不允许 super 引用接口,Aggragoth 对此评论说:一个类可以实现多个接口,所以如果它们每个都有一个名为number 的成员,编译器无法确定您尝试使用super.number 引用哪个接口的number

【讨论】:

  • 此外,接口中的所有字段默认为public static final(无需显式声明),使其成为常量字段,而不是实例成员。
【解决方案2】:

int number = super.number; 在接口中声明的每个变量都是最终的,即它的值不能改变。而且super这个关键字是用来获取父类的public, protected or default variables的,不是接口。由于这些原因,编译器会在此处抛出错误。

正如 StriplingWarrior 和 Aggragoth 已经说过一个类可以实现多个接口,所以如果他们每个都有一个名为 number 的成员,编译器就不可能确定你试图用 @ 引用哪个接口的编号987654325@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多