Java 中来自静态上下文的不明确调用

2022-09-03 01:34:40

main 方法尝试访问 var,但会导致不明确的调用。为什么?无论如何,Base1 中的实例变量 var 都无法从静态上下文中访问(可见?)。

  class Base1 {
      int var;
  }

  interface Base2 {
      public static final int var = 0;
  }

  class Test extends Base1 implements Base2 { 
      public static void main(String args[]) {
          System.out.println("var:" + var); 
      }
  }

答案 1

字段访问多义性的 JLS 规则

如果标识符在 类型 中命名了几个可访问 (§6.6) 成员字段,则该字段访问不明确,并且会发生编译时错误。T

关于可访问性问题

仅当引用类型的成员(类、接口、字段或方法)或类类型的构造函数可访问并且成员或构造函数声明为允许访问时,才能访问该类型:

它不会区分实例字段访问是否会导致上下文中的编译错误。static

请注意,您可能有

public static void main(String args[]) {
    Test test = new Test();
    System.out.println("var:" + test.var); 
}

你仍然有模棱两可的感觉。


答案 2

要使其明确无误,请将接口名称作为限定前缀:

class Test extends Base1 implements Base2 { 

      public static void main(String args[]) {
          System.out.println("var:" + Base2.var); 
      }
 }

推荐