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的实例了。

View Code
import java.util.Date;

public class ImportDemo{
     
     private Date currentDate = new Date();  

}

  当我们需要使用util包下面多个类时,import的语句是支持通配符的,可以直接使用import java.util.*; 表明导入util包下的所有类,但不包含子包中的类

  *通配符只能够表明单个包的所有类,不可以使用类似于 import java.*.*;这种通配来导入Java的所有包的类。

2. 使用该类的全包名+.类名

View Code
public  class NoImportDemo{
      
      java.util.Date currentDate = new java.util.Date();        
}

当使用了1方式的import,有可能在引入多个包的过程中,会引入多个同名类。在这种情况下:当我们没有使用冲突的同名类的时候,编译器是不会发出任何抱怨的,而当我们使用了同名的类时,编译由于不知道使用哪个包中的类,会发出抱怨(以java.util.Date和java.sql.Date为例)

View Code
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 ...;

View Code
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的静态方法。能够带来代码上的简洁行不需要每次都加入类名。

posted @ 2012-09-27 00:22  papertiger  阅读(1306)  评论(0编辑  收藏  举报