很多人以為原始碼.java文件中的import會讓編譯器把所import的程序通通寫到編譯好的.class檔案中,或是認(rèn)為import跟C/C++的#include相似,實際上,這是錯誤的觀念。
讓我們先了解一下,Java的package到底有何用處。
其實,package名稱就像是我們的姓,而class名稱就像是我們的名字。package名稱有很多。的,就好像是復(fù)姓。比如說java.lang.String,就是復(fù)姓java.lang,名字為String的類別;java.io.InputStream則是復(fù)姓
java.io,名字為InputStream的類別。
Java會使用package這種機(jī)制的原因也非常明顯,就像我們?nèi)⌒彰粯?,光是一間學(xué)校的同一屆同學(xué)中,就有可能會出現(xiàn)不少同名的同學(xué),如果不取姓的話,那學(xué)校在處理學(xué)生數(shù)據(jù),或是同學(xué)彼此之間的稱呼,就會發(fā)生很大的困擾。相同的,全世界的Java類別數(shù)量,恐怕比臺灣人口還多,而且還不斷的在成長當(dāng)中,如果類別不使用套件名稱,那在用到相同名稱的不同類別時,就會產(chǎn)生極大的困擾。幸運的是,Java的套件名稱我們可以自己取,不像人的姓沒有太大的選擇(所以有很多同名同姓的),如果依照Sun的規(guī)范來取套件名稱,那理論上不同人所取的套件名稱不會相同(請參閱“命名慣例”的相關(guān)文章),也就不會發(fā)生名稱沖突的情況。
可是問題來了,因為很多套件的名稱非常的長,在寫程序時,會多打好多字,花費不少時間,比如說:
java.io.InputStreamis=java.lang.System.in;
java.io.InputStreamReaderisr=newjava.io.InputStreamReader(is);
java.io.BufferedReaderbr=newjava.io.BufferedReader(isr);
實在是不美觀又麻煩。于是,Sun想了一個辦法,就是import.
這個import就是在程序一開頭的時候,先說明程序中會用到那些類別的
簡稱,也就是只稱呼名字,不稱呼他的姓。首先,在檔案開頭寫:
importjava.lang.System;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.BufferedReader;
這幾行說明了這四個姓名的類別,在程序中只用他的名字來稱呼,所以當(dāng)程序中提到System就是指java.lang.System,而InputStream就是指java.io.InputStream,依此類推。于是原來的程序就變成:
InputStream=System.in;
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
這樣看起來是不是清爽多了呢?如果這些類別用的次數(shù)很多,那就更能體會到import的好處了??墒沁@樣還是不夠,因為懶是人的天性,還是會有人覺得打太多import了也很浪費時間,于是Sun又提供了一個方法:
importjava.lang.*;
importjava.io.*;
意思就是,等一下程序中提到的沒有姓名的類別,不是姓java.lang,就是姓java.io,如果這兩個里面有同樣名字的類別,而不幸的你又只用名字稱呼這個類別,那編譯器仍然會跟你抱怨,因為它還是不知道你說的這個類別指那一
個姓的類別。那可不可以再懶一點呢,只寫:
importjava.*;
歷史告訴我們,人可以懶,但不能太懶,這樣是不行的。因為那些類別是姓java.io而不是姓java.就像姓「諸葛」的人應(yīng)該不會喜歡你稱他為「諸」先生吧。
為甚么我一開始說import跟#include不同呢?因為import的功能到此為止,它不像#include一樣,會將檔案內(nèi)容載入進(jìn)來。import只是請編譯器幫你打字,讓編譯器把沒有姓的類別加上姓,并不會把別的文件的程式碼寫進(jìn)來。如果你想練習(xí)打字,可以不要使用import,只要在用到類別的時候,用它的全部姓名來稱呼它就行了(就像例子一開始那樣),跟使用import完全沒有甚么兩樣。
另外,雖然人不可以太懶,但是Sun還是幫我們多偷了一點懶。因為java.lang這個套件實在是太常太常太常用到了,幾乎沒有程序不用它的,所以不管你有沒有寫importjava.lang;,編譯器都會自動幫你補(bǔ)上,也就是說編譯器只要看到?jīng)]有姓的類別,它就會自動去java.lang里面找找看,看這個類別是不是屬于這個套件的。所以我們就不用特別去importjava.lang了。
讓我們先了解一下,Java的package到底有何用處。
其實,package名稱就像是我們的姓,而class名稱就像是我們的名字。package名稱有很多。的,就好像是復(fù)姓。比如說java.lang.String,就是復(fù)姓java.lang,名字為String的類別;java.io.InputStream則是復(fù)姓
java.io,名字為InputStream的類別。
Java會使用package這種機(jī)制的原因也非常明顯,就像我們?nèi)⌒彰粯?,光是一間學(xué)校的同一屆同學(xué)中,就有可能會出現(xiàn)不少同名的同學(xué),如果不取姓的話,那學(xué)校在處理學(xué)生數(shù)據(jù),或是同學(xué)彼此之間的稱呼,就會發(fā)生很大的困擾。相同的,全世界的Java類別數(shù)量,恐怕比臺灣人口還多,而且還不斷的在成長當(dāng)中,如果類別不使用套件名稱,那在用到相同名稱的不同類別時,就會產(chǎn)生極大的困擾。幸運的是,Java的套件名稱我們可以自己取,不像人的姓沒有太大的選擇(所以有很多同名同姓的),如果依照Sun的規(guī)范來取套件名稱,那理論上不同人所取的套件名稱不會相同(請參閱“命名慣例”的相關(guān)文章),也就不會發(fā)生名稱沖突的情況。
可是問題來了,因為很多套件的名稱非常的長,在寫程序時,會多打好多字,花費不少時間,比如說:
java.io.InputStreamis=java.lang.System.in;
java.io.InputStreamReaderisr=newjava.io.InputStreamReader(is);
java.io.BufferedReaderbr=newjava.io.BufferedReader(isr);
實在是不美觀又麻煩。于是,Sun想了一個辦法,就是import.
這個import就是在程序一開頭的時候,先說明程序中會用到那些類別的
簡稱,也就是只稱呼名字,不稱呼他的姓。首先,在檔案開頭寫:
importjava.lang.System;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.BufferedReader;
這幾行說明了這四個姓名的類別,在程序中只用他的名字來稱呼,所以當(dāng)程序中提到System就是指java.lang.System,而InputStream就是指java.io.InputStream,依此類推。于是原來的程序就變成:
InputStream=System.in;
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
這樣看起來是不是清爽多了呢?如果這些類別用的次數(shù)很多,那就更能體會到import的好處了??墒沁@樣還是不夠,因為懶是人的天性,還是會有人覺得打太多import了也很浪費時間,于是Sun又提供了一個方法:
importjava.lang.*;
importjava.io.*;
意思就是,等一下程序中提到的沒有姓名的類別,不是姓java.lang,就是姓java.io,如果這兩個里面有同樣名字的類別,而不幸的你又只用名字稱呼這個類別,那編譯器仍然會跟你抱怨,因為它還是不知道你說的這個類別指那一
個姓的類別。那可不可以再懶一點呢,只寫:
importjava.*;
歷史告訴我們,人可以懶,但不能太懶,這樣是不行的。因為那些類別是姓java.io而不是姓java.就像姓「諸葛」的人應(yīng)該不會喜歡你稱他為「諸」先生吧。
為甚么我一開始說import跟#include不同呢?因為import的功能到此為止,它不像#include一樣,會將檔案內(nèi)容載入進(jìn)來。import只是請編譯器幫你打字,讓編譯器把沒有姓的類別加上姓,并不會把別的文件的程式碼寫進(jìn)來。如果你想練習(xí)打字,可以不要使用import,只要在用到類別的時候,用它的全部姓名來稱呼它就行了(就像例子一開始那樣),跟使用import完全沒有甚么兩樣。
另外,雖然人不可以太懶,但是Sun還是幫我們多偷了一點懶。因為java.lang這個套件實在是太常太常太常用到了,幾乎沒有程序不用它的,所以不管你有沒有寫importjava.lang;,編譯器都會自動幫你補(bǔ)上,也就是說編譯器只要看到?jīng)]有姓的類別,它就會自動去java.lang里面找找看,看這個類別是不是屬于這個套件的。所以我們就不用特別去importjava.lang了。

