import static和import有何区别?为何在我的这段简单代码里无发编译运行?谢谢

claider 2019-01-21 04:34:43
最近在看《thinking in java》 4th edition。章节Enumerated Types第一个习题

设我在当前目录下:有文件ChapterEnumExe1.java
import static enumerated.Signal;

// Define an enum type:
//enum Signal { GREEN, YELLOW, RED, }

//public class TrafficLight {
public class ChapterEnumExe1 {
Signal color = Signal.RED;
public void change() {
switch(color) {
// Note that you don't have to say Signal.RED
// in the case statement:
case RED: color = Signal.GREEN;
break;
case GREEN: color = Signal.YELLOW;
break;
case YELLOW: color = Signal.RED;
break;
}
}
public String toString() {
return "The traffic light is " + color;
}
public static void main(String[] args) {
ChapterEnumExe1 t = new ChapterEnumExe1();
for(int i = 0; i < 7; i++) {
System.out.println(t);
t.change();
}
}
} /* Output:
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
*///:~

还有一个目录enumerated,其下有文件:
//ernumerated/Signal.java
package enumerated;

public enum Signal { GREEN, YELLOW, RED, }


在文件ChapterEnumExe1 中:
如果去掉import static enumerated.Signal;中的static,则可以得到正确结果
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED

否则的话,编译时提示如下错误:
ChapterEnumExe1.java:1: 错误: 找不到符号
import static enumerated.Signal;
^
符号: 类 enumerated
ChapterEnumExe1.java:1: 错误: 仅从类和接口静态导入
import static enumerated.Signal;
^
ChapterEnumExe1.java:8: 错误: 无法访问Signal
Signal color = Signal.RED;
^
错误的类文件: .\Signal.class
类文件包含错误的类: enumerated.Signal
请删除该文件或确保该文件位于正确的类路径子目录中。
ChapterEnumExe1.java:13: 错误: 找不到符号
case RED: color = Signal.GREEN;
^
符号: 变量 RED
位置: 类 ChapterEnumExe1
ChapterEnumExe1.java:15: 错误: 找不到符号
case GREEN: color = Signal.YELLOW;
^
符号: 变量 GREEN
位置: 类 ChapterEnumExe1
ChapterEnumExe1.java:17: 错误: 找不到符号
case YELLOW: color = Signal.RED;
^
符号: 变量 YELLOW
位置: 类 ChapterEnumExe1

请教各位高手,这是为啥?谢谢!
按照书上原文说法,应该是要做 static import,而且原作者代码中多处使用
import static net.mindview.util.Print.*;
...全文
110 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小萌心 2019-01-21
  • 打赏
  • 举报
回复
import static(静态导入)是JDK1.5中的新特性,一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*;这里多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名的方式来调用。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧