我创建了一个名为Rectangle的类,并将其放入一个名为' shapes'的包中。然后我创建了另一个名为Test的类,我从中导入了自定义Rectangle类和java.awt.Rectangle类。测试引用了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;
}
答案 0 :(得分: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();