JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 閒聊 -- package 與 import [精華]
swanky

暴走熊

版主

發文: 461
積分: 9
於 2003-08-21 08:20 user profilesend a private message to usersend email to swankyreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
轉錄自java連線版

有些人寫了一陣子 Java,可是對於 Java 的 package 跟 import 還是不
太了解很多人以為原始碼 .java 檔案中的 import 會讓編譯器把所 import
的程式通通寫到編譯好的 .class 檔案中,或是認為 import 跟 C/C++ 的
#include 相似,實際上,這是錯誤的觀念。

讓我們先了解一下,Java 的 package 到底有何用處。

其實,package 名稱就像是我們的姓,而 class 名稱就像是我們的名字
。package 名稱有很多 . 的,就好像是複姓。比如說 java.lang.String,就
是複姓 java.lang,名字為 String 的類別;java.io.InputStream 則是複姓
java.io,名字為 InputStream 的類別。

Java 會使用 package 這種機制的原因也非常明顯,就像我們取姓名一樣
,光是一間學校的同一屆同學中,就有可能會出現不少同名的同學,如果不取
姓的話,那學校在處理學生資料,或是同學彼此之間的稱呼,就會發生很大的
困擾。相同的,全世界的 Java 類別數量,恐怕比台灣人口還多,而且還不斷
的在成長當中,如果類別不使用套件名稱,那在用到相同名稱的不同類別時,
就會產生極大的困擾。幸運的是,Java 的套件名稱我們可以自己取,不像人
的姓沒有太大的選擇 ( 所以有很多同名同姓的 ),如果依照 Sun 的規範來取
套件名稱,那理論上不同人所取的套件名稱不會相同 ( 請參閱 "命名慣例"
的相關文章 ),也就不會發生名稱衝突的情況。

可是問題來了,因為很多套件的名稱非常的長,在寫程式時,會多打好多
字,花費不少時間,比如說:

1
2
3
    java.io.InputStream is = java.lang.System.in;
    java.io.InputStreamReader isr= new java.io.InputStreamReader(is);
    java.io.BufferedReader br = new java.io.BufferedReader(isr);


實在是不美觀又麻煩。於是,Sun 想了一個辦法,就是 import。

這個 import 就是在程式一開頭的時候,先說明程式中會用到那些類別的
簡稱,也就是只稱呼名字,不稱呼他的姓。首先,在檔案開頭寫:

1
2
3
4
    import java.lang.System;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;


這幾行說明了這四個姓名的類別,在程式中只用他的名字來稱呼,所以當程式
中提到 System 就是指 java.lang.System,而 InputStream 就是指
java.io.InputStream,依此類推。於是原來的程式就變成:

1
2
3
    InputStream = System.in;
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);


這樣看起來是不是清爽多了呢?如果這些類別用的次數很多,那就更能體會到
import 的好處了。可是這樣還是不夠,因為懶是人的天性,還是會有人覺得
打太多 import 了也很浪費時間,於是 Sun 又提供了一個方法:

1
2
    import java.lang.*;
    import java.io.*;


意思就是,等一下程式中提到的沒有姓名的類別,不是姓 java.lang,就是姓
java.io,如果這兩個裡面有同樣名字的類別,而不幸的你又只用名字稱呼這
個類別,那編譯器仍然會跟你抱怨,因為它還是不知道你說的這個類別指那一
個姓的類別。那可不可以再懶一點呢,只寫:

1
    import java.*;


歷史告訴我們,人可以懶,但不能太懶,這樣是不行的。因為那些類別是姓
java.io 而不是姓 java。就像姓『諸葛』的人應該不會喜歡你稱他為『諸』
先生吧。

為甚麼我一開始說 import 跟 #include 不同呢?因為 import 的功能
到此為止,它不像 #include 一樣,會將檔案內容載入進來。import 只是請
編譯器幫你打字,讓編譯器把沒有姓的類別加上姓,並不會把別的檔案的程
式碼寫進來。如果你想練習打字,可以不要使用 import,只要在用到類別的
時候,用它的全部姓名來稱呼它就行了(就像例子一開始那樣),跟使用
import 完全沒有甚麼兩樣。

另外,雖然人不可以太懶,但是 Sun 還是幫我們多偷了一點懶。因為
java.lang 這個套件實在是太常太常太常用到了,幾乎沒有程式不用它的,
所以不管你有沒有寫 import java.lang;,編譯器都會自動幫你補上,也就
是說編譯器只要看到沒有姓的類別,它就會自動去 java.lang 裡面找找看,
看這個類別是不是屬於這個套件的。所以我們就不用特別去
import java.lang 了。


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
shawshy





發文: 1
積分: 0
於 2004-08-02 16:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝。
現在終于明白暸package和import的區別和作用。


shawshy edited on 2004-08-02 16:57
reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
bbsbsai

J@VA+Firefox



發文: 86
積分: 0
於 2004-08-02 20:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝swanky大大讓我覺得如獲至寶,

且觀念也澄清了許多,讓我在學習java的路上再進步了一些∼∼

感謝囉∼


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
Golden





發文: 2
積分: 0
於 2004-08-22 16:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
非常感谢!
我一直以为import 与#include是一样呢
现在明白了!


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
qazxsw99

ˋ(′ε‵")ˊ~~~



發文: 14
積分: 0
於 2004-08-25 13:52 user profilesend a private message to usersend email to qazxsw99reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
難怪...看到其他人寫程式碼都會有import...
我自己都沒有寫過....原來是....會用到其他package....
阿~~~我會再多多努力的...


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
hodala





發文: 2
積分: 0
於 2004-10-04 22:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝大大 好清楚的解說 完全懂了......

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
bin1x





發文: 85
積分: 0
於 2004-10-05 09:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝你在觀念上的教導
可否再請教
在java中
是以這種方式在表示目錄結構
xxxx.xxxx.xxx
在netbean中
有file system的mount
是設定存取其他class起始點......我不清楚,假設啦
在對目錄架構不清楚的情況下
能否採用類似dos,append 命令的方式
取用file,再使用其中的class
假設不行
能否以netbean 觀點對import 做個說明
因為我每次mount 一個目錄
就被樹狀結構弄到昏了
假設沒有
就算了


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
dorian

Dorian



發文: 164
積分: 5
於 2004-10-07 09:00 user profilesend a private message to usersend email to dorianreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也来说说楼主没说道的内容!

import导入声明可分为两中:
1>单类型导入(single-type-import)
例:import java.util.ArrayList;
2>按需类型导入(type-import-on-demand)
例:import java.util.*;

以这样两种方式导入包中的任何一个public的类和接口(只有public类和接口才能被导入)

*导入声明仅导入类型而不导入子包;这就是为什么称它们为单类型导入和按需类型导入声明的原因.

*导入的类或接口的简名(simple name)具有编译单元作用域.这表示该类型简名可以在导入语句所在的编译单元的任何地方使用.这并不意味着你可以使用该类型所有成员的简名,而只能使用类型自身的简名.
例如: java.lang包中的public类都是自动导入的,包括Math和System类.但是,你不能使用简名PI()和gc(),而必须使用Math.PI()和System.gc().你不需要键入的是java.lang.Math.PI()和java.lang.System.gc().

程序员有时会导入当前包或java.lang包,这是不需要的,因为当前包的成员本身就在作用域内,而java.lang包是自动导入的.java编译器会忽略这些冗余导入声明(redundant import declarations).即使像这样
import java.util.ArrayList;
import java.util.*;
多次导入,也可编译通过.编译器会将冗余导入声明忽略.

使用按需导入声明是否会降低Java代码的执行效率?绝对不会!
Java编译器产生的类文件仅包含编译单元实际使用到的类或接口的符号引用.

这是否意味着你总是可以使用按需导入声明?是,也不是!
在类似Demo的非正式开发中使用按需导入声明显得很有用.
然而,有这四个理由让你可以放弃这种声明:
1>编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计.
2>命名冲突:解决避免命名冲突问题的答案就是使用全名.而按需导入恰恰就是使用导入声明初衷的否定.
3>说明问题:全名的使用是自说性的.毕竟高级语言的代码是给人看的.
4>无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明.如果有命名冲突就会产生问题.
Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到:
在java.util.Properties类中的导入声明:
import java.io.IOException;
import java.io.printStream;
import java.io.printWrite;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.Hashtable;

你可以看到有趣的是,她连java.util.Hashtable也导入,这可是在当前包中啊!
先写这写,希望对你有用!


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
f8801030





發文: 12
積分: 0
於 2004-10-08 19:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝 大大的指導
觀念有好一點了


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
SUPERCOOLMAN





發文: 31
積分: 0
於 2004-12-15 11:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不知道能不能繁體化一下看到頭痛CCC

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
shiao





發文: 30
積分: 0
於 2004-12-17 00:52 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
繁體化 @@"
==============================================

我也來說說樓主沒說道的內容!

import導入聲明可分為兩中:
1>單類型導入(single-type-import)
例:import java.util.ArrayList;
2>按需類型導入(type-import-on-demand)
例:import java.util.*;

以這樣兩種方式導入包中的任何一個public的類和接口(只有public類和接口才能被導入)

*導入聲明僅導入類型而不導入子包;這就是為什麼稱它們為單類型導入和按需類型導入聲明的原因.

*導入的類或接口的簡名(simple name)具有編譯單元作用域.這表示該類型簡名可以在導入語句所在的編譯單元的任何地方使用.這並不意味著你可以使用該類型所有成員的簡名,而只能使用類型自身的簡名.
例如: java.lang包中的public類都是自動導入的,包括Math和System類.但是,你不能使用簡名PI()和gc(),而必須使用Math.PI()和System.gc().你不需要鍵入的是java.lang.Math.PI()和java.lang.System.gc().

程序員有時會導入當前包或java.lang包,這是不需要的,因為當前包的成員本身就在作用域內,而java.lang包是自動導入的.java編譯器會忽略這些冗余導入聲明(redundant import declarations).即使像這樣
import java.util.ArrayList;
import java.util.*;
多次導入,也可編譯通過.編譯器會將冗余導入聲明忽略.

使用按需導入聲明是否會降低Java代碼的執行效率?絕對不會!
Java編譯器產生的類文件僅包含編譯單元實際使用到的類或接口的符號引用.

這是否意味著你總是可以使用按需導入聲明?是,也不是!
在類似Demo的非正式開發中使用按需導入聲明顯得很有用.
然而,有這四個理由讓你可以放棄這種聲明:
1>編譯速度:在一個很大的項目中,它們會極大的影響編譯速度.但在小型項目中使用在編譯時間上可以忽略不計.
2>命名衝突:解決避免命名衝突問題的答案就是使用全名.而按需導入恰恰就是使用導入聲明初衷的否定.
3>說明問題:全名的使用是自說性的.畢竟高級語言的代碼是給人看的.
4>無名包問題:如果在編譯單元的頂部沒有包聲明,Java編譯器首選會從無名包中搜索一個類型,然後才是按需類型聲明.如果有命名衝突就會產生問題.
Sun的工程師一般不使用按需類型導入聲明.這你可以在他們的代碼中找到:
在java.util.Properties類中的導入聲明:
import java.io.IOException;
import java.io.printStream;
import java.io.printWrite;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.util.Hashtable;

你可以看到有趣的是,她連java.util.Hashtable也導入,這可是在當前包中啊!
先寫這寫,希望對你有用!


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
carden





發文: 1
積分: 0
於 2004-12-21 14:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝…
我是Java菜鳥,看了文章之後,真是明白好多哦…
謝謝大大Big Smile


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
TIJ_Rob





發文: 23
積分: 0
於 2005-01-01 17:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
上面幾位大大討論的觀念我都搞董了
不過請問 接口是什麼??
能否有人順便解釋一下 大陸跟這邊講法的翻譯..感激不盡!!Wink


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:TIJ_Rob]
tekwei

系統穩定



發文: 978
積分: 4
於 2005-01-01 20:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
TIJ_Rob wrote:
上面幾位大大討論的觀念我都搞董了
不過請問 接口是什麼??
能否有人順便解釋一下 大陸跟這邊講法的翻譯..感激不盡!!Wink

接口為對岸術語。
see: 介面(interface)

翻譯看: 英中繁简编程术语对照


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
TIJ_Rob





發文: 23
積分: 0
於 2005-01-03 00:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
實在太感謝了!!
看了我就知道怎麼把大陸文章翻譯成我們的用語了!!Big Smile


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
smallchickenlee

Javachicken



發文: 80
積分: 1
於 2005-01-14 00:42 user profilesend a private message to usersend email to smallchickenleereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
厚厚~~~
大大的解釋真是讓人一目了然,姓、名、複姓...,呵,如果早點來這裡,應該可以少花不少冤枉錢,想學好一樣東西,環境真是太重要了,我愈來愈喜歡這裡了。謝謝...Food


reply to postreply to post
我真的好喜歡Java喔...
作者 Re:閒聊 -- package 與 import [Re:swanky]
hungsheng





發文: 5
積分: 0
於 2005-01-26 07:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
thank you loh, that makes sense.

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
elvis_meng





發文: 8
積分: 0
於 2005-01-26 16:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Swanky與Dorian的比喻說明, 讓人更加了解Import的使用. 過去C語言裡, #include愈多, 以cc或cpp編譯後的檔案會加大, 所以都會用一些Pre-Compile的指令來檢查是否應用程式有重複#include相同的Lib檔案. Java 的Compiler, 也就是javac更加聰明, 即是用import指令, 程式碼不會加大. 各位可將手邊的程式測試一下, 會有更深的感覺.

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
sunyudong2001





發文: 3
積分: 0
於 2005-04-30 10:40 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
thanks!!
good !


reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
s891039





發文: 1
積分: 0
於 2005-06-03 15:20 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
哇真是謝謝你 明白很多

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
HaHa100





發文: 3
積分: 0
於 2005-06-07 19:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
還是霧煞煞,看來我這個新人要加油了....

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
java0906





發文: 8
積分: 0
於 2005-09-19 01:53 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
是謝謝你 明白很多

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
lulala0309





發文: 6
積分: 0
於 2005-10-18 18:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
寫的太讚了~ ^^

reply to postreply to post
裝睡的人叫不醒~裝病的人醫不好..

如果要飛的高~ 就該把地平線忘掉...
作者 Re:閒聊 -- package 與 import [Re:swanky]
jackya





發文: 2
積分: 0
於 2005-10-20 03:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
了解了,謝謝,今天晚上一直在想這個問題,找到答案了。

reply to postreply to post
作者 Re:閒聊 -- package 與 import [Re:swanky]
jeroworld





發文: 1
積分: 0
於 2006-08-05 00:40 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
以前之會跟著書藉範例import,現在終於了了,感恩啦

reply to postreply to post
go to first page go to previous page  1   2  go to next page go to last page
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8