我创建了一个名为 Rectangle 的类,并将其放入一个名为“shapes”的包中。然后,我创建了另一个名为 Test 的类,从中导入了自定义 Rectangle 类和 java.awt.Rectangle 类。测试引用了 Rectangle 类。当我尝试编译时,我收到消息“对矩形的引用不明确”。
但是,我随后将自己的 Rectangle 类放入默认包中(即未声明包名称),并像以前一样导入 java.awt.Rectangle 类。在编译时,编译器使用默认包中的 Rectangle 类,而不是我从 java.awt 包中导入的类。
如果能澄清何时存在或不存在冲突,以及如果不存在冲突,当两个文件名相同时编译器使用哪个类,我们将不胜感激。
这是根据要求的代码:
测试类
import java.awt.*;
public class Test {
public static void main(String[] args) {
Rectangle r = new Rectangle();
System.out.println(r.width);
}
}
自定义矩形类
public class Rectangle {
public int width = 1;
}
最佳答案
从 java 5 开始,您不再需要从默认包中导入类 - 这意味着 java 总是通过“默认”导入所有默认类。这就是它如此命名的原因。
因此,无论您将什么放入默认包中,它都会导入到您的所有类中。这可能会导致运行时出现大类和不必要的内存负载。如果没有非常具体的原因,将类放入默认包中是不明智的。
除了默认包之外,java还总是从java.lang包中导入System、String、Integer、Array、Float类。您从来不需要导入这些类,不是吗? 默认包中的类的行为相同。
对于现在的解决方案,如果您想访问具有相同名称的类,但不在默认包中,您始终可以使用完整的限定名称,例如 package.Class
my.package.MyClass c = new my.package.MyClass();
c.doSomething();
MyClass defaultClass = new MyClass();
defaultClass.doSomethingWithinAClassFromDefaultPackage();
关于java - 同名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29315557/