来自Java中静态上下文的模糊调用

时间:2014-07-07 14:09:22

标签: java static ambiguous non-static

主方法尝试访问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); 
      }
  }

4 个答案:

答案 0 :(得分:17)

JLS rule for field access ambiguity

  

如果标识符在中指定了几个可访问的(§6.6)成员字段   键入T,然后字段访问是不明确的和编译时错误   发生。

on the subject of accessibility

  

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

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

请注意,您可能已经

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

你仍然有歧义。

答案 1 :(得分:3)

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

class Test extends Base1 implements Base2 { 

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

答案 2 :(得分:1)

首先,在第一步中,编译器将在您扩展的类和您实现的接口中查找变量var。由于它在第二步中找到了两个地方的变量,因此显示出歧义。

答案 3 :(得分:1)

静态和非静态上下文不规定如何访问变量

访问修饰符实际上是这个... ...

将Base1 中 var的访问修饰符更改为 私有 ,并且歧义消失,但这可能不是您想要的方式塑造,但访问modfiers实际上决定了对实例变量的引用,而不是静态无静态上下文。

class Base1 {
    private int var;
    //static int var=5;
}

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

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

上面的代码编译得很好。