关于Java的导入语法的歧义

时间:2015-02-13 21:53:09

标签: java packages ambiguity

在准备JCA考试时,我刚刚看到了这个片段

import java.lang.String.*; 
class EJava 
{
String guru; 
}

这当然是无意义的代码,因为默认情况下会导入java.lang。无论如何,作者想要使用它来表明这个代码不会编译,因为它使用了错误的导入语法。

但是代码确实可以编译。那么使用通配符的导入只能意味着两件事吗?

import somepackage.*; // import any type in the package somepackage 

import somepackage.type.*; // import any member of this type (equivalent to : import somepackege.type;)

2 个答案:

答案 0 :(得分:4)

这肯定会编译,但该语句将导入java.lang.String类中的所有公共嵌套类,遗憾的是没有。

如此有效地说这句话毫无用处而且无害。编译应该没有问题。


如果您使用静态导入,则情况会有所不同,因为String类中有许多静态方法。

答案 1 :(得分:3)

来自Java Language Specification

  

type-import-on-demand 声明允许所有可访问类型的a   根据需要导入的命名包或类型。

     

[...]

     

static-import-on-demand 声明允许所有可访问的静态   要根据需要导入命名类型的成员。

所以你的

import java.lang.String.*; 

会导入String中所有可访问的类型(Oracle JDK 8中没有可访问的类型)。 static导入会导入所有可访问的static成员,包含方法