5.4.3 package、import和import static
5.4.3 package、import和import static
package
Java
引入了包( package
)机制,提供了类的多层命名空间,用于解决类的命名冲突
、类文件管理等问题。Java
允许将一组功能相关的类放在同一个package
下,从而组成逻辑上的类库单元。如果希望把个类放在指定的包结构下,应该在Java
源程序的第一个非注释行
放置如下格式的代码:package packageName;
一旦在Java
源文件中使用了这个package
语句,就意味着该源文件里定义的所有类都属于这个包。位于包中的每个类的完整类名都应该是包名和类名的组合,如果其他人需要使用该包下的类,也应该使用包名加类名
的组合.
包名的命名规则
Java
语法只要求包名是有效的标识符即可,但从可读性规范角度来看,包名应该全部是小写字母而且应该由一个或多个有意义的单词连缀而成。
一个源文件只能指定一个包
package
语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,即只能包含一条package
语句,该源文件中可以定义多个类,则这些类将全部位于该包下。
没有package语句这处于默认包
如果没有显式指定package
语句,则处于默认包下。在实际企业开发中,通常不会把类定义在默认包下。
同一个包下的类可以自由访问
父包和子包在用法上则不存在任何关系,如果父包中的类需要使用子包中的类,则必须使用子包的全名,而不能省略父包部分。
import关键字
Java
引入了import
关键字, import
可以向某个Java
文件中导入指定包层次下某个类或全部类,import
语句应该出现在package
语句之后、类定义之前。
一个Java
源文件只能包含一个package
语句,但可以包含多个import
语句,多个import
语句用于导入多个包层次下的类。
import导入单个类
使用import
语句导入单个类的用法如下:import package.ClassName
import导入一个包下的所有类
使用import
语句导入指定包下全部类的用法如下:import package.*
上面import
语句中的*
只能代表类,不能代表包。
import语句可以简化编程
正如上面代码中看到的,通过使用import
语句可以简化编程。但import
语句并不是必需的,只要坚持在类里使用其他类的全名,则可以无须使用import
语句。
java默认导入java.lang包下的所有类
Java
默认为所有源文件导入java.lang
包下的所有类,因此前面在Java
程序中使用String
、 System
类时都无须使用import
语句来导入这些类。但对于前面介绍数组时提到的Arrays
类,其位于java.util
包下,则必须使用import
语句来导入该类。
import语句导入同名类的情况
在一些极端的情况下, import
语句也帮不了我们,此时只能在源文件中使用类全名。
例如,需要在程序中使用java.sql
包下的类,也需要使用java.util
包下的类,则可以使用如下两行import
语句:import java.util.*;
import java.sql*;
如果接下来在程序中需要使用Date
类,则会引起编译错误。而import
语句导入的java.sql
和java.util
包下都包含了Date
类,系统不知道你要调用的是哪个Date
类。在这种情况下,如果需要指定包下的Date
类,则只能使用该类的全名。
静态导入
JDK1.5
以后更是增加了一种静态导入的语法,它用于导入指定类的某个静态成员变量
、某个静态方法
或全部的静态成员变量
、全部的静态方法
。
静态导入使用import static
语句,静态导入也有两种语法,分别用于导入指定类的单个静态成员变量、方法和全部静态成员变量、方法,
导入单个静态成员变量或静态方法
导入指定类的单个静态成员变量、方法的语法格式如下:import static package.ClassName.fieldName;
import static package.ClassName.methodName;
上面语法导入package.ClassName
类中名为fieldName
的静态成员变量
或者package.ClassName
类中名为methodName
的静态方法。
例如,可以使用import static java.lang.System.out;
语句来导入java.lang.System
类的out
静态成员变量。
静态成员变量和静态成员方法同名的情况
如果一个类中的静态成员变量和静态成员方法同名,则直接一个名字,即可同时导入
静态成员变量和静态成员方法,如下所示:import static package.ClassName.sameName;
虽然静态成员变量和静态成员方法同名,不过两者用法上存在区别,编译器还是可以区分同名的变量和方法的(方法调用会带括号)
1 | package statictest; |
1 | import static java.lang.System.*; |
1 | 3.141592653589793 |
导入类的全部静态成员变量或静态方法
导入指定类的全部静态成员变量、方法的语法格式如下:import static package.ClassName.*;
上面语法中的星号只能代表静态成员变量或方法名。
import static语句应该写在哪里
import static
语句也放在Java
源文件的package
语句之后、类定义之前,即放在与普通import
语句相同的位置,而且import
语句和import static
语句之间没有任何顺序要求。
import static
也就被翻译成了”静态导入”。
用一句话来归纳import
和import static
的作用:使用import
可以省略写包名;而使用import static
则可以连类名都省略。
import
和import static
的功能非常相似,只是它们导入的对象不一样而己。import
语句和import static
语句都是用于减少程序中代码编写量的。