Java中使用import语句有两种语法:
1)import+空格+类全限定名+;
2)import+空格+类的全限定名+.+*+;
---使用方法2)时,引入一个包中的所有类,但所有类不包含类的子包中的类
此外,Java程序中有包(package)common,包common中包含有类Bus.java,Car.java,RaceCar.java和包special,而包special中有类Race.java类。
对于如下源代码:
package useimport;
import commom.*;
import commom.special.*;
public class UseImport3{}
在类UseImport3中,我们使用了两个import语句将两个包中的所有类都引入了进来。包括common.RaceCar,common.Car,common.Bus和common.special.RaceCar.我们发现,有两个RaceCar类被引入了进来,但是没有关系,Java允许两个使用import的第2中语法的import语句引入类名重复的类。
但是Java不允许两个使用第一种语法的import语句同时引入两个名字相同的类,也就是说下面的代码是错误的。
package useimport;
import common.special.RaceCar;
import common.RaceCar;
public class UseImport4{}
但Java允许一个使用第一种语法的import语句和一个使用第2种语法的import语句引入类名相同的类,也就是说下面的代码是正确的。
package userimport;
import common.*;
import common.special.RaceCar;
public class UseImport5{}
好的,下面假设我们要在类UseImport3和UseImport5类中使用类common.special.RaceCar,应该怎么办?
在类UseImport3中,因为两个import语句都包含有名字为RaceCar的类,所以,如果直接在类中使用类名RaceCar,Java编译器则会找到两个匹配的全限定类名common.special.RaceCar和common.RaceCar(注意,import语句的前后顺序是没有关系的)。这时候Eclipse的Problems视图就会给出一个错误:The type RaceCar is ambiguous.错误的意思就是无法确定RaceCar的全限定名到底是哪一个。
所以需要在UseImport4中,当第一种import语句引入的类与第二种import语句引入的类都是同一个类的时候,Java编译器会优先处理使用第一种import语句的(因为第一种import语法比较专一)。也就是说,在类UseImport5中,虽然import common.*;和import common.special.RaceCar;都同时引入了名为RaceCar的类,但是Java编译器会认为RaceCar类就是common.special.RaceCar类,而如果需要使用common.RaceCar类,则必须得在类UseImport5的主体中使用其全限定名,修改后的UseImport5中同时使用了common.RaceCar类和common.special.RaceCar类。
package useimport;
import common.*;
import common.special.RaceCar;
public class UseImport5{
RaceCar refToCommonDotSpecialDotRaceCar;
common.RaceCar refToCommonDotRaceCar;}
通过上面的分析可知:RaceCar refToCommonDotSpecialDotRaceCar是类common.special.RaceCar的引用,refToCommonDotRaceCar是类common.RaceCar的引用。
回到类UseImport3,因为使用第一种语法引入的类的优先级高于第二种语法,所以也可以给UseImport3添加一个使用第一种语法的import语句,来告诉编译器类主体中的RaceCar代表的是类common.special.RaceCar,看UseImport6类的代码。
package useimport;
import common.*;
import common.special.RaceCar;
import common.special.RaceCar;
public class UseImport{
RaceCar refToCommonDotSpecialDotRaceCar;}
小结一下吧:
Java编译器不允许在同一个源文件中存在两个或多个使用第一种语法的import语句引入类名相同的类。
如果第一种语法的import语句引入的类和第二种语句引入的类有冲突(类UseImport5),Java编译器会采用第一种import语法结构引入的类。