首頁 >Java >java教程 >Java中關於package(套件)的總結介紹

Java中關於package(套件)的總結介紹

little bottle
little bottle轉載
2019-04-08 16:24:533314瀏覽

Java裡的包,可以理解成資料夾因為它是樹狀結構的路徑,當我們用package把套件宣告到某個package下面時,我們也要把它的.class放到以該package為名字的目錄下,否則將找不到類別。

       要把類別放到某個套件需要用package語句,事實上,當我們沒有使用package語句時,我們的類別都被放到了一個預設缺省包,這也是為什麼我們在執行Java程式時,在運行目錄下面不能有同名的.class檔案。

       此外,一個完整類別名稱是套件名稱 類別名稱,在沒有import導入的情況下,使用一個類別需要給出完整的類別名稱,如java.util.Date。為了方便,Java自動導入兩個包java.lang和現在文件的缺省包,也就是說:(1)Java規定,其他包使用java.lang包中的類時無需給出完整類名;(2 )預設包中的類別之間(或者說同一個包下面)互相使用也不需要給出完整類別名。

  

       有套件的類別和無套件的類別互相存取有以下規則:(1)無套件的類別可以存取有套件的類別, 直接導入即可;(2)有包的類別無法存取無包的類別, 直接存取是找同一個包中的, 由於不同包需要導入, 而無包的類無法導入;(3)在定義類的時候, 為了讓別人都能使用, 所以一定要定義一個包。

        Java的包包表面上看起來(從路徑上看)是有等級的,但實際上並沒有,例如java.awt,java.awt.color是兩個地位相同的包。 java.awt.color並不屬於java.awt。

         在採用類別名稱方式使用一個類別的時候, 先在目前套件中尋找是否有這個類別, 如果沒有才去導入的套件中找。

套件的成員

一些相關聯的類別、介面、枚舉、註解類型、套件中的類別所用到的資源檔案如圖片等 

套件的作用

(1)將相關聯的介面和類別集合到一塊

例如,package graphics; 就把圖形處理相關的模組放到一起

#(2)避免了類型之間命名衝突:套件作為一種封裝,給類別提供多層命名空間。

(3)實現了外界對套件的存取控制

套件的使用(套件的宣告、導入)

總的來說,套件的使用可以總結為三個步驟:如何將類別和介面捆綁到套件中、如何使用套件中的類別、以及如何安排檔案系統以便編譯器找到原始檔案。

一、定義套件

1、有套件類別的宣告

在原始程式碼的第一行使用package關鍵字定義套件. 套件名稱通常全部小寫, 用"."分隔。

套件的命名規格請見連結:https://segmentfault.com/a/1190000008711718

                 namingpkgs. html

套件的聲明有以下原則:(1)package語句必須放在原始檔開頭;(2)一個原始檔案只能有一個package語句;(3)套件名稱全部小寫,避免與類別、接口的名字衝突。

2、編譯帶包的類別

javac -d 目錄原始檔名.java

3、運行帶包的類別

java 包名.類別名稱

二、使用套件

同個套件的類別之間存取比較簡單,在程式碼中直接以類別名稱使用;而不同套件之間的存取則必須滿足一個條件:一個類別如果希望被其他套件中的類別存取, 那麼必須加上public修飾(注意:用public修飾的類別必須和檔案名稱同名)。不同套件之間的使用通常有以下3種方法:(1)使用全名存取類別;(2)import 該類別;(3)import 包含該類別的整個套件

1、使用全名存取類別;(3)import 該類別;(3)import 包含該類別的整個套件

1、使用全名

假設有個graphics包,其中有一個Circle類別(public修飾),那麼外包存取它時如下所示:

graphics.Circle cir = new graphics.Circle();

2、導入該類別

上面使用全名的方法有些繁瑣,如果要略寫或經常使用這個類別時可以這樣:

import graphics.Circle;

public class PackageTest {
    public static void main(String[] args) {
        Circle cir = new Circle();
    }
}

3、導入整個包

###當我們想要使用該包的更多類,例如Line類別時,可以把該套件的所有類別都導入:###
import graphics.*;

public class PackageTest {
    public static void main(String[] args) {
        Circle cir = new Circle();
        Line line = new Line();
    }
}

三、管理文件系统

许多Java平台的实现依赖于文件系统的等级制度 来管理源文件和class文件。我们一般把类、接口、枚举、注释类型放在可以反映包名的目录中,比如,Rectangle.java属于graphics类,我们就放在.....\graphics\Rectangle.java的路径上。同样,我们对其进行编译产生的class文件也要放在类似的目录上(这个目录最好不要和源文件放在一起),这样的好处是当我们要复用某个类时,就知道到哪去找了,JVM在运行程序时也知道去哪里找类。

比如,源文件放在:86a15073ee07a5288ef78984c38cc44e\sources\com\example\graphics\Rectangle.java

class文件放在:1c88c48f018631bbf99e30d7795bbcba\classes\com\example\graphics\Rectangle.class,其中,1c88c48f018631bbf99e30d7795bbcba\classes是类路径(class path),由CLASSPATH系统变量进行设置,而包名是com.example.graphics。编译器、JVM通过将包名称添加到类路径来构造.class文件的路径。

所以编译器、JVM在路径1c88c48f018631bbf99e30d7795bbcba\classes\com\example\graphics中查找类文件。class path可以有好几条,由分号(Windows)或冒号(UNIX)分隔。 默认情况下,编译器、JVM搜索当前目录和包含Java平台类的JAR文件,所以这些目录自动位于类路径中。

CLASSPATH是JVM或Java编译器中的一个参数,它指定用户定义的类和包的位置。 可以在命令行上或通过环境变量设置。默认情况下,我们访问JDK标准API和扩展包时,无需设置查找位置。 而用户自定义的包和库,则必须设置。由于JVM会在当前目录下搜索,所以当我们的文件都在运行目录下时,也可以不设置CLASSPATH。

有关CLASSPATH可以参考:

https://en.wikipedia.org/wiki/Classpath_%28Java%29

https://en.wikipedia.org/wiki/Java_Classloader

关于Import

关于import,有三个注意的地方。

1、

首先是,Java的包表面上的等级问题。从路径上看,包似乎是分层的,但它们不是。 例如,Java API包括java.awt包,java.awt.color包,java.awt.font包等等。但是,java.awt.color包、java.awt.font包和其他java.awt.xxxx包并不属于java.awt。 前缀java.awt(The Java abstract window toolkit)的作用只是告诉开发者——和窗口有关的包都在这里面。但是包和包之间并不是包含关系。

当你导入java.awt.*时,会导入java.awt包中的所有类型,但它不会导入java.awt.color,java.awt.font或任何其他java.awt.xxxx包的所有类型。 如果你要使用java.awt.color中的类以及java.awt中的类,则必须同时导入导入这两个包:

import java.awt.*;
import java.awt.color.*;

2、

其次是名字含糊不清的问题。当你导入的两个包中有一个类名字相同时,如果你继续采用缩写,就会出现一些问题。这时,你就要使用这个类的全名。比如,java.util、java.sql包中都有Date类,程序又同时导入了这两个包中的Date类。

import java.sql.*;
import java.date.*;

3、static import

当我们需要频繁访问某个类的常量和静态方法,反复写它们的前缀(全名)可能不利于代码阅读。 静态import语句就提供了一种导入要使用的常量和静态方法的方法,这样您就不需要为其名称添加前缀。比如java.lang.Math类定义PI常量和许多静态方法,包括计算正弦,余弦,切线,平方根,最大值,最小值,指数等。

import static java.lang.Math.PI;
import static java.lang.Math.cos;

public class ImportTest {
    public static void main(String[] args) {
        double r = Math.cos(Math.PI * 2);
		double r1 = Math.cos(PI * 2);
		double r2 = cos(PI * 2);
		System.out.println(r+" "+r1+" "+r2);    
    }
}

当然,你也可以直接全部导入:

import static java.lang.Math.*;

应该注意的是,使用静态导入时要非常谨慎。 过度使用静态导入会导致代码难以阅读和维护,因为阅读者不知道某个特定的静态对象是哪个类的。 不过,当我们恰当地使用静态导入时,代码可以因为不用繁琐地写全名而更具可读性。

 【推荐课程:Java视频教程】   

以上是Java中關於package(套件)的總結介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除