Java中的包,类的导入,静态导入
包的作用
1. 为了更好的组织代码,能够将自己的代码与代码库的代码分离。
2. 在需要合作完成的工作中,可以使用分包的方式来尽量的减少类命名的冲突。
Sun公司推荐程序员使用公司域名的反向字符作为公司项目的起始包名:如 baidu.com --> com.baidu
引入包的概念,主要是为了解决类名冲突的问题,能够使合作的团队中,在各自的包内自由的命名而不受到其他包的名称的影响。
包的概念主要是为了程序员的一个方便理解和开发,对于编译器而言,包->子包 并不表明任何的关系,他们分别是一组类的集合。
标示类所处的包的语法(必须是类文件中除注释以外的第一句):
package com.baidu;
使用javac,java命令必须将当前目录到基目录:
javac com/baidu/HelloWorld.java (编译器并不检查本文件的目录结构是否与对应文件的包声明一致,当该类不引用自身的类,是不会报错)
java com.baidu.HelloWorld (解释器欲运行某类,必须将完整的包名.类名)
类的导入:
一个类能够使用该包中的所有类以及外包中的所有public类。因为只有内部类才可以被修饰为protected和private.对于一个普通类是不可以被protected和private修饰的。所以根据访问控制修饰符的概念。
使用类有两种方式(以使用java.util.Date为例):
1. 使用import语句将欲使用的类进行导入
import java.util.Date;
经过上文的导入语句之后,就可以构造Date的实例了。
import java.util.Date; public class ImportDemo{ private Date currentDate = new Date(); }
当我们需要使用util包下面多个类时,import的语句是支持通配符的,可以直接使用import java.util.*; 表明导入util包下的所有类,但不包含子包中的类
*通配符只能够表明单个包的所有类,不可以使用类似于 import java.*.*;这种通配来导入Java的所有包的类。
2. 使用该类的全包名+.类名
public class NoImportDemo{ java.util.Date currentDate = new java.util.Date(); }
当使用了1方式的import,有可能在引入多个包的过程中,会引入多个同名类。在这种情况下:当我们没有使用冲突的同名类的时候,编译器是不会发出任何抱怨的,而当我们使用了同名的类时,编译由于不知道使用哪个包中的类,会发出抱怨(以java.util.Date和java.sql.Date为例)
import java.util.*; import java.sql.*; public Class NameConflictDemo{ Date currentDate = new Date(); //Compiler Error. }
在上文的代码中,由于编译器无法确定使用util包还是sql包中的Date类。
为了避免引起这样的冲突,我们可以在额外的加入一句我们真正要使用的那个Date的import语句,如我们要使用util的Date,我们加入import java.util.Date;
但是经过这样做了之后,我们在程序中的所有的Date都是util的Date,当我们需要同时使用util的Date和sql的Date时,我们就需要使用2方式(全包名.类名)
Import 和 C++的include并没有什么共同之处:
C++并不打开#include指定的文件,进行类的搜索。然而Java的编译器负责定位我们指定的Import的类(搜索的路径由我们的classpath决定)
Java可以不做import的动作,而使用全包名.类名来引用类,然而C++是必须加入#include对应的头文件的
某些程度上来讲,import和namespace有一定的相似相处。
静态方法+静态变量的导入
在J2SE5之后,对import语句做了一定量的加强,主要是支持导入类的静态方法以及静态变量
语法为:
import static ...;
import static java.lang.System.*; import static java.math.Math.*; public class StaticImportDemo{ public static void main(String[] args){ out.println(sqrt(4)); } }
上述代码,静态的导入System的out静态变量,以及Math的sqrt的静态方法。能够带来代码上的简洁行不需要每次都加入类名。