1. 程式人生 > >JAVA:不同包(package)的類之間如何呼叫(import)

JAVA:不同包(package)的類之間如何呼叫(import)

【1】問題描述

Java由於應用了package的機制,將不同的類存放在不同 的類名空間中,如果不同包之間互相呼叫其中的類時,該怎麼辦呢,是直接呼叫還是有什麼其他方法呢?

【2】屬於不同包的類之間的呼叫方法

程式1:Test.java

package org.it315.example;
public class Test 
{
    public void print() 
    {
        System.out.println("Hello World!");
    }
}

程式2:TestPackage.java

package org.it315;
public
class TestPackage { public static void main(String[] args) { new Test().print(); } }

程式1和2都放在同一目錄下:
這裡寫圖片描述
執行
這裡寫圖片描述

出錯的原因是:在類TestPackage中直接呼叫類Test,編譯器會認為這兩個類應在同一個包中,即Test完整名稱為org.it315.Test。因此,在沒有使用import語句時,可以將“程式2”按照下面修改。

修改“程式1”

package org.it315;
public class TestPackage 
{
    public
static void main(String[] args) { new org.it315.example.Test().print(); } }

執行
這裡寫圖片描述

【3】import

  • 在上面的修改過程中是,要呼叫的類直接將一個類的全名給寫出來,即加上包名字首:org.it315.example。
  • 新的問題來了,如果在程式中,要呼叫很多不再同一個包中的類,按照上述的做法就必須在類名前加上包名字首。這時,為了簡化書寫操作,就可以使用import語句來簡化此問題。通過使用import語句來匯入指定的類的所屬包即可。
  • import語句的做法就是在每個.java檔案的第一條package語句的後面新增要呼叫的類的包名。
  • 語法格式為:import PackageName.*;
    import PackageName.ClassaName;

對“程式2”進行修改:

package org.it315;
import org.it315.example.*;//標記1
//import org.it315.example.Test;//標記2
public class TestPackage 
{
    public static void main(String[] args) 
    {
        new Test().print();
    }
}

執行
這裡寫圖片描述

  • 通過重新編譯可以發現,正是import語句的使用,我們在使用某個包裡的類時,就不再需要寫上一長串的包名了(如:org.it315.example)。

  • “標記1”和“標記2”所代表的語句的區別是:”標記1“的import語句匯入了整個包中的類,此時程式凡是遇到的org.it315.example包中的類,都不再寫包名(org.it315.example)了。”標記2“的import語句只是匯入了該包中的Test類,對該包中的其他類不起作用,在程式遇到Test類時,就不再寫包名了。然而,對於包中其他的類的呼叫,就必須寫上完整的包名。

【4】import使用注意事項

  • 如果兩個包中有相同的類名,程式在呼叫這兩個指定的類時,就必須寫上完整的包名。如,java.util、java.sql包中都有Date類,程式又同時匯入了這兩個包中的所有類,如:
import java.util.*;
import java.sql.*

這時程式要呼叫Date類時就需要這個指定的類的地方寫上完整的包名,如:java.sql.Date();或者增加一個特定的import語句來解決這個問題:import java.sql.Date;

  • 只能使用星號(*)匯入一個包,而不能使用import.java.*或import java.*.*匯入以java為字首的所有包。

  • 父包與子包:如org.it.315.* 和 org.it315.example.*。父包中的類呼叫子包中的類,必須用子包的全名,不能省略父包名部分。

  • 當import了一個包中的所有類,並不會import這個包中的子類,如果程式中用到了子包的類,需要再次對子包單獨匯入。

  • import語句應該位於原始檔的頂部(但是位於package語句的後面),位於類定義之前。

    修該“程式2“

package org.it315;
import org.it315.*;
public class TestPackage 
{
    public static void main(String[] args) 
    {
        new Test().print();
    }
}

執行
這裡寫圖片描述
可以發現,編譯不成功。由於只是import了類Test的父包,Test本身所在的包並沒有匯入進去。

再次修改”程式2”

package org.it315;
import org.it315.example.*;
public class TestPackage 
{
    public static void main(String[] args) 
    {
        new Test().print();
    }
}

執行,編譯成功,執行成功。
這裡寫圖片描述

【5】靜態匯入

  • import語句不僅可以匯入一個特定的類或整個包。還可以匯入靜態方法和靜態變數。靜態匯入是JDK1.5版本新增加的一個特性,儘管通常被稱為“靜態匯入”,但注意語法上不是 static import ,而是 import static 。
  • 當在一個類中需要使用外部包中的靜態成員變數或成員方法時,可以使用以下方式匯入外部靜態成員:
    (1)import static 包名.類名.靜態成員變數名;
    (2)import static 包名.類名.靜態成員方法名;
    (3)import static 包名.類名.*;//使用萬用字元“*”匯入某個類的所有的靜態成員。

  • 用例項來說明靜態匯入的用法:
    (1)按照上述的import匯入一個類

package org.it315.example;

public class TestStaticImport 
{
    public static final int age = 100;
    public static final String name = "Brian";
    public static void printAge()
    {
        System.out.println("AGE = " + age);
    }
    public static void printName() 
    {
        System.out.println("NAME = " + name);
    }
}

package blog.csdn;
import org.it315.example.TestStaticImport;

public class TestPackage 
{
    public static void main(String[] args) 
    {
        int AGE = TestStaticImport.age;
        String NAME = TestStaticImport.name;
        //new TestStaticImport().printName();
        //new TestStaticImport().printAge();
        TestStaticImport.printName();
        TestStaticImport.printAge();
        System.out.println(AGE);
        System.out.println(NAME);
    }
}

這裡寫圖片描述
(2)使用import static 匯入靜態成員函式和變數

package org.it315.example;

public class TestStaticImport 
{
    public static final int age = 100;
    public static final String name = "Brian";
    public static void printAge()
    {
        System.out.println("AGE = " + age);
    }
    public static void printName() 
    {
        System.out.println("NAME = " + name);
    }
}
package blog.csdn;
//import static org.it315.example.TestStaticImport.*;
import static org.it315.example.TestStaticImport.age;
import static org.it315.example.TestStaticImport.name;
import static org.it315.example.TestStaticImport.printAge;
import static org.it315.example.TestStaticImport.printName;

public class TestPackage 
{
    public static void main(String[] args) 
    {
        int AGE = age;
        String NAME = name;
        System.out.println(AGE);
        System.out.println(NAME);

        //new TestStaticImport().printName();
        //new TestStaticImport().printAge();
        printName();
        printAge();

    }
}

這裡寫圖片描述

【6】包的作用域

  • 標記為public的部分可以被任意的類使用;
  • 標記為private的部分只能被定義它們的類使用;
  • 如果沒有指定public或private,這個部分(類,方法,變數)可以被同一個包中的所有方法訪問。

【7】JDK中的最常見的六種包

  • java.lang——包含一些Java語言的核心類,如String、Math、Integer、System和Thread,提供常用功能。
  • java.awt——包含了構成抽象視窗工具集(abstract window toolkits)的多個類,這些類被用來構建和管理應用程式的圖形使用者介面(GUI)。
  • java.applet——包含applet執行所需的一些類。
  • java.net——包含執行與網路相關的操作的類。
  • java.io——包含能提供多種輸入輸出功能的類。
  • java.util——包含一些實用工具類,如定義系統的特性、使用日期日曆相關的函式。

    【8】包package的作用域、類成員的訪問控制

    這裡寫圖片描述