为什么在Java类中找不到值?

时间:2013-08-07 03:30:48

标签: java

这是问题,当我定义这样的界面时:

package mypackage;
public interface Ainterface {
  int VAL = 6;
}

然后我定义了一个类:

public class Aclass implements Ainterface {
  private String[] str = new String[VAL];
  public static void main(String[] args) { ... }
}

当我编译程序时,会显示错误消息:找不到符号“VAL”。

符号:VAL

职位:Aclass

4 个答案:

答案 0 :(得分:6)

  

当我编译程序时,会显示错误消息:找不到符号“VAL”。

这是 only 编译器错误消息吗?如果是,请goto wtf;

如果不是,是否有任何其他编译器错误消息等同于编译器说它也找不到Ainterface?如果是这样,您的问题很简单。似乎Aclass位于不同的包中,或者您希望它位于同一个包中。在前一种情况下,您需要import mypackage.Ainterface。在后一种情况下,您需要将Aclasspackage mypackage放在同一个包中。

跆拳道:

您能否制作一个显示问题的最小工作示例?问题在于:我必须非常努力地重现你的问题,而且你不太可能遇到这个问题。

几乎没有可能。

一个。 AinterfaceAclass位于同一个包中。在这种情况下,应该没有问题。

Ainterface.java:  

package mypackage;

public interface Ainterface {
  int VAL = 6;
}

Aclass.java

package mypackage;

public class Aclass implements Ainterface {
  private String[] str = new String[VAL];
  public static void main(String[] args) { }
}

AinterfaceAclass位于不同的包中。在这种情况下,必须import mypackage.Ainterface java源文件中的Aclass导入语句package mypackage; public interface Ainterface { int VAL = 6; } Aclass.java: package myotherpackage; import mypackage.Ainterface; public class Aclass implements Ainterface { private String[] str = new String[VAL]; public static void main(String[] args) { } } 。在这种情况下,应该没有问题。

Ainterface

在这两种情况下,代码都将按编译。这些都不会产生问题,而且它们是唯一有意义的两种可能性。还有第三种可能性。请告诉我它这个。您有两个Aclass已定义,一个在一个包中,一个在另一个包中,package位于与未定义VAL的定义相同的Ainterface.java: package mypackage; public interface Ainterface { int VAL = 6; } Ainterface.java: package myotherpackage; public class Ainterface { } Aclass.java: package myotherpackage; public class Aclass implements Ainterface { private String[] str = new String[VAL]; public static void main(String[] args) { } } 中:< / p>

Ainterface

产生错误。并且,要明确的是,这个可以意外发生。假设您定义mypackage并将其放在Aclass中。假设您定义mypackage.Ainterface并且未将其放在同一个包中而忘记导入Ainterface。如果您使用的是像Eclipse这样的IDE,您将收到一条错误消息,{{1}}无法解析为某种类型,并且您将有三种快速修复:“导入'Ainterface'(mypackage)”, “创建界面'Ainterface'”,“修复项目设置......”。如果你不小心点击了第二个选项,你最终会遇到这种情况。但这只是愚蠢的,不能成为你的意图。所以,帮助我们帮助你。

答案 1 :(得分:1)

您应该以静态方式引用VAL,因为接口中定义的所有变量都是默认publicstaticfinal。这应该有效:

  private String[] str = new String[Ainterface.VAL];

答案 2 :(得分:1)

除了方法声明之外,接口还可以包含常量声明。界面中定义的所有常量值都隐式 public,static和final 。再一次,可以省略这些修饰符。查看this了解详情。

因此,为了访问它,请使用Ainterface.VAL(因为在接口中定义的变量是静态的)。

private String[] str = new String[Ainterface.VAL];

答案 3 :(得分:0)

如果存在于同一个包中,这样可以正常工作,但如果您希望将这些文件放在不同的包中,则可以执行以下任一操作。

选项1:

Import mypackage;
<{1>}文件中的

选项2:
或者使用Aclass.java更改VAL,然后声明变为

Ainterface.VAL