Java import语句小迷惑

来源:互联网 发布:qq三国50js小红鬼 编辑:程序博客网 时间:2024/04/29 07:17

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语法结构引入的类。