我在 Windows 操作系统中,在 eclipse IDE 中工作,我有以下两种情况:
<强>1。我创建了下面的类,它位于 Employee.java 类中(E 为大写):
public class Employee {
public static void main(String[] args) {
employee emp = new employee();
emp.test();
}
}
//here e is in lowercase
class employee {
public void test() {
System.out.println("I am in test()");
}
}
在这种情况下,我得到了以下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: employee (wrong name: Employee)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
.
.
.
at Employee.main(Employee.java:4) // i.e at emp.test();
<强>2。我创建了下面的类,这是 Employee.java 类:
public class Employee {
public static void main(String[] args) {
}
}
现在,当我尝试在同一个包中创建employee.java(e为小写)类时,我在Eclipse中收到消息:存在具有相同名称但大小写不同的类型。
我的问题是:Java 区分大小写。这是否意味着 JVM(基于 Windows 和 UNIX)区分大小写,或者编译器区分大小写?以及为什么它在场景 1 中给出了异常,而 Eclipse 不允许我在场景 2 中的同一位置创建employee.java 文件。
还记得我使用的是 Windows 操作系统,它的文件名不区分大小写,所以我知道它不允许 employee.java 和 Employee.java 位于同一位置。 这是否违反了 Java 大小写敏感性?
最佳答案
这不是 Java 的限制,而是您尝试写入文件的 Windows 文件系统的限制。在不区分大小写的文件系统上,编译器无法将 Employee.class
和 employee.class
都写入磁盘,因为就 FS 而言,它们是相同的文件.
如果您能以某种方式编译到区分大小写的文件系统(例如在 Linux 上),然后将生成的类文件打包到 JAR 中,那么您将能够在 Windows 上从该 JAR 运行而不会出现错误,作为 ZIP文件能够包含两个不同的条目,其名称仅大小写不同。
关于Java 区分大小写 : Class file collision: A resource exists with a different case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810791/