【本節目标】
通過閱讀本節内容,你将了解到如何使用import導入其他包實作跨包調用類、如何處理多個包中存在同名類的情況、靜态導入純靜态類可以實作方法的直接調用等内容。
包的導入
利用包的定義實際上就可以将不同功能的類儲存在不同的包之中,但是這些類彼此之間也一定會存在有互相調用的關系,那麼在這種情況下就需要使用import語句來導入其它包中的程式類。
範例:定義一個程式類“cn.mldn.util.Message”,這個類負責進行一個消息資料的擷取
package cn.mldn.util ;
public class Message {
public String getContent() {
return "www.mldn.cn" ;
}
}
範例:定義一個測試類使用Message類“cn.mldn.test.TestMessage”。
package cn.mldn.test ;
import cn.mldn.util.Message ; //導入其它包的類
public class TestMessage {
public static void main(String args[]) {
Message msg = new Message() ; //執行個體化類對象
System.out.println(msg.getContent()) ; //www.mldn.cn
}
}
此時按照使用順序來講肯定是要先編譯Message.java,而後再編譯TestMessage.java,但是請思考一個問題:如果有一個程式代碼,裡面有100個類,彼此之間互相引用嚴格,此時怎麼區分呢?那麼這個時候最好的做法不是區分順序,而是直接交給Java自己去完成:javac -d . *.java;
特别需要注意的是:關于public class 與class定義的差別?
- public class:類名稱必須與檔案名稱保持一緻,一個*.java檔案裡面隻允許有一個public class,同時如果一個類需要被其它的包所使用,那麼這個類一定要定義為public class;
- class:類名稱可以與檔案名稱不一緻,并且在一個.java檔案裡面可以提供有多個class定義,編譯後将形成不同的.class檔案,但是這些類隻能被本包所通路,外包無法通路。
- 在實際的開發之中往往在一個*.java源代碼檔案裡面隻會提供有一個程式,而這個程式類一般都使用public class定義;
程式類中定義的包名稱必須采用小寫字母的形式定義,例如:cn.mldn.util;
但是這個時候會有一個新的問題産生,有些時候可能會使用某一個包中的很多類,于是這樣分開進行類的導入會比較麻煩,為了解決這樣的問題,也可以使用通配符“*”來進行處理。
package cn.mldn.test ;
import cn.mldn.util.* ;
public class TestMessage {
public static void main(String args[]) {
Message msg = new Message() ; //執行個體化類對象
System.out.println(msg.getContent()) ; //www.mldn.cn
}
}
即便此時使用了“包.”的導入形式,那麼也不表示要進行全部的加載,它會根據自己的需要加載所需要的程式類,而不需要的程式類是不會被加載的,是以是使用“”還是使用具體的類其最終性能是完全相同的。
但是如果在開發中采用的是“包.*”的形式進行包的導入時,那麼會有一點比較麻煩:有可能兩個不同的包中存在有相同的類名稱。例如,現在假設TestMessage類由于某種需要要導入兩個包:cn.mldn.util、org.demo,但是這兩個包裡面都有Message類。
cn.mldn.util.Message:
package cn.mldn.util ;
public class Message {
public String getContent() {
return "www.mldn.cn" ;
}
}
org.demo.Message:
package org.demo;
public class Message {
public String getInfo() {
return "人民萬歲!";
}
}
由于某種需要在TestMessage類裡面導入了兩個包:
package cn.mldn.test ;
import cn.mldn.util.* ; //導入其它包的類
import org.demo.* ; //導入其它包的類
public class TestMessage {
public static void main(String args[]) {
Message msg = new Message() ; //執行個體化類對象
System.out.println(msg.getContent()) ; //www.mldn.cn
}
}
程式編譯:
javac-d . TestMessage.java
org.demo中的類org.demo.Message和cn.mldn.util中的類cn.mld n.util.Message都比對Test Message.java:6:錯誤:對Message的引用不明确
Message msg=new Message() ; //執行個體化類對象
org.demo中的類org.demo.Message和cn.mld n.util中的類cn.mld n.util.Message都比對2個錯誤
這個時候就會發現類名稱相同的時候就會出現不明确的引用處理,是以此時最簡單的處理形式就是直接寫上類的完整名稱。
cn.mldn.util.Message msg = new cn.mldn.util.Message() ;
在日後的開發過程之中經常會見到大量的重名的類(包不重名),此時為了更好的解決問題,往往會使用類的完整名稱進行操作。
包的靜态導入
假如說現在有一個類,這個類中的全部方法都是static方法,那麼按照原始做法肯定要導入程式所在的“包.類”,然後才可以通過類名稱調用這些靜态方法;
範例:定義一個MyMath數學類
package cn.mldn.util ;
public class MyMath {
public static int add(int ... args) {
int sum = 0 ;
for (int temp : args) {
sum += temp ;
}
return sum ;
}
public static int sub(int x , int y) {
return x - y ;
}
}
如果此時按照原始的方式進行導入處理,那麼此時就需要導入包.類,而後通過類名稱調用方法。
範例:原始方式使用
package cn.mldn.test ;
import cn.mldn.util.MyMath ;
public class TestMath {
public static void main(String args[]) {
System.out.println(MyMath.add(10 , 20 ,30)) ;
System.out.println(MyMath.sub(30 ,20)) ;
} //執行結果:60 10
}
從JDK1.5開始,對于類中全部由靜态方法提供的特殊類是可以采用靜态導入處理形式的。
範例:靜态導入處理
package cn.mldn.test ;
import static cn.mldn.util.MyMath.* ;
public class TestMath {
public static void main(String args[]) {
System.out.println(add(10 , 20 ,30)) ;
System.out.println(sub(30 ,20)) ;
} //執行結果:60 10
}
當使用了靜态導入處理之後就好比該方法是直接定義在主類中的,可以由主方法直接調用。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:“化繁為簡”-神奇的Jar指令 | 帶你學《Java面向對象程式設計》之六十九 更多Java面向對象程式設計文章檢視此處