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程序中使用StringSystem类时都无须使用import语句来导入这些类。但对于前面介绍数组时提到的Arrays类,其位于java.util包下,则必须使用import语句来导入该类。

import语句导入同名类的情况

在一些极端的情况下, import语句也帮不了我们,此时只能在源文件中使用类全名
例如,需要在程序中使用java.sql包下的类,也需要使用java.util包下的类,则可以使用如下两行import语句:
import java.util.*;
import java.sql*;
如果接下来在程序中需要使用Date类,则会引起编译错误。而import语句导入的java.sqljava.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
2
3
4
5
6
7
8
9
10
package statictest;

public class Statics {
//定义一个静态成员变量.
public static String test = "静态成员 变量";
// 定义一个静态成员方法.
public static String test() {
return "静态成员 方法";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import static java.lang.System.*;
import static java.lang.Math.*;
// 由于成员变量和方法都是test,所以同时导入的静态成员变量和静态成员方法.
import static statictest.Statics.test;

public class StaticImportTest {
public static void main(String[] args) {
// out是java.lang.System类的静态成员变量,代表标准输出
// PI是java.lang.Math类的静态成员变量,表示π常量
out.println(PI);
// 直接调用Math类的sqrt静态方法
out.println(sqrt(256));
out.println(test);
//方法调用会带有括号:test(),所以知道调用的是方法而不是变量.
out.println(test());
}
}
1
2
3
4
3.141592653589793
16.0
静态成员 变量
静态成员 方法

导入类的全部静态成员变量或静态方法

导入指定类的全部静态成员变量、方法的语法格式如下:
import static package.ClassName.*;
上面语法中的星号只能代表静态成员变量或方法名。

import static语句应该写在哪里

import static语句也放在Java源文件的package语句之后、类定义之前,即放在与普通import语句相同的位置,而且import语句和import static语句之间没有任何顺序要求。

import static也就被翻译成了”静态导入”。

用一句话来归纳importimport static的作用:使用import可以省略写包名;而使用import static则可以连类名都省略。

importimport static的功能非常相似,只是它们导入的对象不一样而己。import语句和import static语句都是用于减少程序中代码编写量的。