一、繼承的概念
1.一個父類別衍生出子類別的機制稱為繼承。
2.承是重用程式碼的強大手段,當多個類別之間存在相同的屬性和方法時,可以從這些類別中抽像出父類別。
3.們只需要在父類別中定義這些屬性和方法,而子類別無須重新定義這些屬性和方法,直接從父類別繼承即可。
4.藉由繼承,子類別就會自動的擁有在父類別中定義的屬性與方法。
5.兩個或多個類別的成員中存在一部分相同的情況,透過繼承機制,可以利用現有的類別來建立新的類別。
6.子類別不但有父類別的成員,也可定義新的成員。
7.可提升軟體的可重複使用性和可擴充性。
二、父類別與子類別
1.父類別:基底類別或超類別
2.子子類別:衍生類別或衍生類別
三、繼承的實作
# 使用extends關鍵字。
四、存取控制
Java語言設定了存取控制規則,並限制外部類別使用類別的成員
存取修飾符 |
#自身存取 |
包內存取 |
包外子類別存取 |
|
#包外訪問 |
public | 是 | #是 |
|
#是 |
protected | 是 |
#是 |
|
否 |
#預設 | 是 |
是 |
|
private |
注意:父類別中用private修飾的屬性和方法對子類別是透明的,不能被繼承。
五、繼承中的建構方法
1.父類別的建構方法無法被類別繼承
2.子類別在執行自己的建構方法之前必須先呼叫父類別的建構方法,呼叫分為兩種:
a.顯示呼叫:在子類別的建構方法中的第一句使用關鍵方法字來指定稱為父類別的哪一個建構方法
super(參數列表)//呼叫父類別帶參數的建構方法
b.隱含呼叫:如果沒有顯示調用,則自動調用父類別無參數的建構方法,相當於顯示呼叫super(),也就是說當呼叫父類別預設的方法時,可以省略super()
特別注意:
1.子類別建構方法的呼叫順序為,先呼叫父類別的建構方法,在呼叫子類別的建構方法
2.當父類別中有預設建構方法,子類別建構方法可以省略對父類別建構方法的顯示呼叫
3.當父類別中只有帶參數的建構方法時,子類別的建構方法中必須使用super關鍵字顯示呼叫父類別的建構方法
六、類別的層次結構 1.Java語言中不支援多繼承,即一個類別只能直接繼承一個類別。
2.一個類別可以有多個間接父類別。
3.所有的Java類別都直接或間接的繼承了java.lang.Object類別
4.Object類別是所有Java類別的祖先,並在Object類別中定義了所有Java類別中的所有Java類別物件都擁有的相同的行為
七、預設繼承 1.定義一個類別時,並沒有使用extends關鍵字,那麼這個類別就直接繼承自Object類別
第八章:Java#多態性
#一、多型概念
正式定義:多態性是指對類別的成員方法的呼籲將形成不同的實現方式 引用指向子類別物件##
#### 多態性必須存在於繼承的環境中,也就是說繼承是多態的前提條件,是物件導向程式設計的核心,利用多態可以有效的提升程序的可擴充性###### 多重狀態分為兩種:###### 動態多型:建立在繼承與方法重寫的基礎上###### ###### 動態多型也稱為動態綁定,通常我們說多型態一般是指動態多型態。 ############二、方法重寫##########如果在子類別中定義一個方法,其名稱、傳回值類型和參數清單剛好與父類別中的某個方法完全匹配,我們就可以說子類別的方法重寫了父類別的方法。
為特別注意事項:
1.方法在對中選擇繼承關係為前提條件
父類別的方法相同
#三、多態應用
當一個父類別的引用指向子類別對象,藉由此引用呼叫方法,總是呼叫子類別重寫之後的方法
子類別的物件賦給父類別的引用,這種行為稱為“向上轉型”,可以隱式轉換父類別的引用轉換回子類別的引用,此行為稱為“向下轉型”,需要強制轉換##
特別注意:當父類別的引用指向子類別對象,對方法的呼叫是動態解析的,即根據物件的實際型別來動態選擇,稱為動態綁定
四、
Object類別 Object類別是所有Java類別的父類別或間接父類別,根據多態性特性,我們可以使用Object類別的參考指向任何物件 注意:若能確定Object所引用的物件的特定類型,可進行向下轉型(強制轉換)
五、
#equals
方法 equals方法的目的在於用於偵測兩個物件是否相等 的equals方法的實作是:偵測兩個物件的記憶體位址是否在同一區域(記憶體位址是否相等) 通常以對equals方法進行重寫,目的是為了重新定義規則來判斷兩個物件是否相等。 個人理解:equals方法是自訂遊戲規則,依照我們的需要來建立物件相等的條件
2、
toString
###方法############ toString方法則傳回一個描述該物件的字串(直接使用物件輸出時必須重寫該方法)###### 個人瞭解:簡化輸出物件訊息的過程,在重寫後直接輸出物件###########2、########### #final############關鍵字############ final關鍵字可用於修飾類別、方法與變量,final表示不可變###### # 1.當final修飾類別時:表示此類別不允許被其他類別繼承###### 2.當final修飾方法時:表示此方法不允許被類別重寫#### final修飾變數時:表示該變數為常數###### ####注意:使用final修飾的常數必須顯示進行初始化
第九章:抽象類別與介面
一、抽象類別概念
從下方往上看類別的繼承關係圖,我們發現類別逐漸變得更通用,也更抽象。
因類變異的一般,我們將無法為類別中的方法建立有意義的實作過程。
有時候我們需要一個父類,此父類只定義可被其所有的子類共享的一般形式,而讓每個子類來補充實現的細節,這樣的類我們稱為抽象類。
:包含抽象方法的類別一定是抽象類別,在抽象類別中可以包含屬性和非抽象方法。
二、抽象方法
定義Java方法時,可只定義出方法的宣告部分,而不必寫出方法體(即方法的實作細節),這樣的方法稱為抽象方法。
注意:抽象方法必須使用abstract關鍵字類別修飾。
三、特別注意
è抽象類別與抽象方法都必須使用abstract關鍵字修飾
沒有方法體,也沒有一對大括號,在參數列表後一定要有分號
è如果類別包含抽象方法,那麼這個類別一定是抽象類別,但相反的,抽象類別中卻不一定包含抽象方法。
è抽像類是不能夠實例化的(即不能創建抽像類的對象)
è抽像類中可以聲明static方法
四、抽象類別的使用
因抽象類別而無法創造對象,所以我們只能透過繼承來使用抽象類別。 (支援多型)
## 注意: 2.如果一個抽象類別繼承了另一個抽象類,那麼子類別就不需要重寫父類別中的抽象方法 五、抽象類別總結# 抽象類別主要由子類別繼承,且由其子類別來發揮作用,那麼抽象類別的作用主要表現在以下兩個面向:
# 1.程式碼重用(表面現象) 2.規劃其子類行為(重點理解) 用一句話來總結抽像類:抽像類就是對類的抽象 六、介面概念在Java中不支援多重繼承,但提供了強大的介面支援
介面:將不相關的,但具有相同行為的類別中的方法規定出來,不需要考慮類別之間的繼承關係 一個類別只能直接繼承父類,但可以實作多個介面介面(interface)是抽象方法和靜態常數的集合,本質上,介面是一種特殊的抽象類,這種抽象類別只能包含抽象方法和靜態常數的定義,沒有變數和方法的實作
七、特別注意
因為介面中定義的方法一定是抽象方法,所以在介面定義抽象方法時可以將public、abstract關鍵字省略
因為介面中定義的變數一定是靜態常數,所以在介面定義靜態常數時可以將public、static、final關鍵字省略
八、介面的使用
同繼承的關係類似,Java類別可以實作(implements)接口,實作類別必須重寫介面中的所有抽象方法
一個實現類別可以實現多個接口,每個接口中間用逗號隔開,一個接口也可以被多個類實現
接口同樣支持使用多態進行編程:接口引用指向實現類對象
介面之間可以有繼承關係,並且支援多重繼承
九、介面總結
用一句話來總結介面:介面是行為(即方法)的抽象
##十、介面與抽象類別的比較
1.相同之處名詞: a.介面是特殊的抽象類別 c.可包含抽象方法 2.不同之處: a.抽象類別可包含非抽象方法,且介面不可以 影響,但對於接口,一旦創建就不應該改變了 c.一個類只能繼承一個抽像類,但一個類可以實現多個接口 十一、預先定義介面Comparable 在java.util套件中有一個Arrays類,該類別的sort方法可以對一個物件陣列進行排序操作,但有一個前提條件就是陣列中的物件必須是實作了Comparable介面的
第一章:異常處理
一、例外概念
例外(Exception)是指程式運作期間發生的事件,此事件可中斷程式指令的正常執行
指令的正常執行 中,異常可分為兩大類: 錯誤(Error):指JVM系統內部錯誤,且資源耗盡等嚴重狀況# 程式設計錯誤或偶然的外在因素導致的一般性問題,例如對負數開平方,空指標訪問,試圖讀取不存在的檔案以及網路連線中斷問題Java語言提供了一套完整的例外處理機制,正確的運用這套機制,有助於提升程式的健全性
注意:Exception與Error有共同的父類Throwable
#二、處理機制
Java程式執行過程中出現異常,系統會自動偵測到並產生一個對應的例外類別對象,然後再將它交給運行時系統
運行時系統再尋找相應的代碼來處理這一異常,如果運行時系統找不到任何可以處理該異常的代碼,則運行時系統將終止,相應的Java程式也將退出
程式設計師沒有處理Error的能力,一般情況下只能處理Exception
111、異常處理特性#3、異常處理特性#「三、異常處理特性#「三、異常處理特性」、「例外處理特性」、「異常處理特性」特性##3、3、異常處理特性 # 將例外分類,以Java類別表示異常,且具有擴充性和可重複使用性
異常流程的程式碼和正常流程的程式碼分離,提升了程式的可讀性 可擷取例外立即處理,也可以丟給上一層來處理,具有彈性四、#Exception
類別 Exception分為兩個分支1.例外:如型別轉換異常,陣列索引越界異常,空指標異常等 2.編譯時異常:SQL語句執行例外,讀取不存在的檔案異常等
#五、常見的例外類型
|
|
說明 |
|
#ArithmeticException
| 算術異常|
ArrayIndexOutOfBoundsException
| 陣列索引越界異常|
#NullPointerException
| #空指標例外|
六、異常處理的宗旨
è返回到一個安全且已知的狀態
能讓使用者執行其他指令
è若可能,保存所有的工作
è若有必要,可退出以避免造成進一步的危害 於非正常的情況,不能用異常來控製程序的正常流程
è避免過於龐大的try塊代碼,try塊代碼越龐大,出現異常的地方就越多,分析異常原因就越困難
七、使用例外處理 Java提供了try-catch-finally語句來支援例外處理
:可能產生例外的程式碼
catch區塊:當產生例外狀況時的處理程式碼
finally區塊:無條件執行程式碼(通常用來釋放資源)## #>
注意:通常當程式產生例外進入catch語句區塊的時候,程式設計師可以使用printStackTrace方法將例外訊息輸出到控制台上 c、宣告拋出例外宣告拋出例外是Java例外處理的第二種方式,如果一個方法中的程式碼在執行時可能產生某種異常,但在本方法中不必,或者無法確定該如何處理此類異常時,則可以使用throws關鍵字聲明拋出異常,此時方法中將不對此類異常進行處理,而是由該方法的呼叫者進行處理#第三章:集合架構
一、集合概述
Java陣列在建立時必須指定陣列的長度,數組一旦創建,其長度就不能再改變 在許多實際情況中,數組的長度是不固定的,因此Java語言中提供了更高級的容器即集合框架來解決相關的問題
所有的Java集合都位於java.util套件中 二、集合概念集合將若干在使用、使用性質相近或相同的“數據”組合而成的一個整體 從體系上講,Java中基本的集合可以分為以下3種:
列表(List): Set集合不區分元素的順序,不允許重複元素映射(Map): Map集合保存成對的“鍵-值”信息,鍵不允許重複,每個鍵最多只能映射一個值 三、集合中的元素#
Java集合中只能儲存引用資料型態資料(即物件),但實際上集合中存放的是物件的引用,而非物件本身,集合中的元素相當於引用型別變數
四、Collection介面
java.util.Collection介面是描述Set和List集合類型的父親介面,定義了集合操作的普遍性方法
常用方法: )
boolean remove(Object o)
int size()
boolean isEmpty()
boolean contains(Object o)
void clear()
Iterator iterator()
五、 List
介面# List介面為Collection介面的子介面 使用者可以對清單元素的插入位置進行精確控制,並新增了根據索引來存取元素等功能,介面中新增了對應的方法 void add(int index,Object element)
Object get(int index) Object set(int index,Object element) (int index) 六、 ArrayListjava.util.ArrayList類別實作了List接口,用於表述長度變化的陣列列表 ArrayList允許取值為null,預設容量為10,除了實作了List介面定義的所有功能外,也提供了一些方法來操作ArrayList容量的大小 public ArrayList() public ArrayList(int capacity)
.Iterator介面描述的是以統一方式對各種集合元素進行遍歷的工具,稱為迭代器 boolean hasNext() # Object next()## #
##八、泛型泛型(Gernerics)機制自JavaSE 5.0開始引入,其實是將原本確定不變的型別參數化
#泛型的好處:1.作為對原有java類型體系的擴充,使用泛型可以提高java應用程序的類型安全,可維護性和可靠性
2.可以解決集合中的數據造型問題
使用方法:
總結:資料型別參數化
#2、HashSet
#HashSet#HashSet類別 java.util.HashSet類別實現了java.util.Set接口,描述典型的Set集合結構 HashSet中不允許出現重複元素,且不不允許重複元素出現確保集合中元素的順序 HashSet中允許包含null值元素,但只能有一個null元素
(C、
#TreeSet
類別
java.util.TreeSet類別也實作了java.util.Set接口,它所描述的是Set的一種變體,可以實現排序功能的集合
在將物件元素新增至TreeSet集合時,會自動依照某種比較規則將其插入到有序的物件序列中,以保證TreeSet集合元素所組成的物件序列時刻依照「升序」排列 TreeSet類別支援兩種排序方式:自然排序(預設)和自訂排序# 必須實作Comparable接口,TreeSet呼叫物件的compareTo方法對元素進行排序 JDK類別庫中有一部分類別實作了Comparable接口,如:Integer、Double、String等
#################################################### ###十一、############List############集合和###########Set############## ########集合的遍歷############ List類型集合:可使用一般for循環,超級for迴圈與迭代器進行遍歷###### 型集合型集合:可以使用超級for迴圈和迭代器進行遍歷###### ###### 注意:由於Set類型集合沒有索引,因此無法使用普通for循環遍歷################### #十二、############Map############(映射)############ Map是一種鍵物件進行映射的集合,它的每個元素都包含兩個物件(鍵物件和值物件)###### 典型的Map類型集合有HashMap和TreeMap###### 新增元素方法:put(#### Object key,Object value)###### 透過鍵物件取得值物件:get(Object key)###### ####### 注意:Map中鍵物件不允許重複,數值物件可重複###十三、TreeMap#類別
TreeMap類別實作了SortedMap接口,因此TreeMap可以根據鍵物件進行排序,但前提條件是所存放的鍵物件必須實作了Comparable介面
十四、Map集合遍歷
由於鍵物件無法重複,所以可將所有的鍵物件看成是一個Set型別的集合
透過Map集合的keySet()方法取得到這個Set型集合
遍歷這個由所有鍵物件組成的SetSetSet1
每在遍歷過程中每取鍵#一、概述
大部分的程式設計工作都涉及資料的傳遞控制(輸入/輸出) Java中的IO採用流的方式來實現,即將資料的傳遞看作為資料的目的和來源之間的流動
IO類別庫位於java.io包中,對各種常見的輸入和輸出流進行了抽象二、流的分類
# 依照IO處理資料的不同分為:位元組流和字元流
# 依功能的差異分為:資料流與操作流程
依實作方式的差異為:底層流與高階流
11串流
將位元組作為最小傳輸單元
### 位元組輸出流抽象化父類別:OutputStream###### ###### 資料流(底層位元流):負責建置位元組資料傳輸的通道,且負責將資料傳輸傳輸,只提供了基本的位元組資料存取的方法。 InputStream和OutputStream是所有位元組流類別的父類,都是抽象類,不能實例化,透過定義了若干的方法來規範子類別的行為,如:IO流結束後必須關閉###### InputStream /OutputStream###### FileInputStream/FileOutputStream###### 操作流(高層流讀取或寫入資料,且僅從其資料中讀取了普通流所沒有提供的方法來簡化程式設計或提高IO的效率。操作流程利用了「裝飾器」設計模式,本身繼承了InputStream類,加入了大量的方法,用來「裝飾」其他資料流類,避免了大量創建新的功能類。 ###### BufferedInputStream/BufferedOutputStream############四、字元流############ # 字元輸入 字元輸入詞輸入字元輸入流抽象程式: # 字元輸出流抽象父類別:Writer######資料流(底層流):###
Reader/Writer
FileReader/FileWriter
#五、位元組字元橋接流
InputStreamReader:使用轉接器設計模式,將InputStream型別轉換為Reader型別
Writer類型 #六、File類別的基本概念 File類別:表示檔案與目錄路徑名稱的抽象表示形式。
File類別可實現檔案的建立、刪除、重新命名、路徑、建立時間等等,是唯一與檔案本身相關的作業類別。第1章:執行緒
執行緒是程式內部的順序控制流程
#一、執行緒與進程1.每個行程都有獨立的程式碼和資料空間,以處理交易的開銷大## 2.執行緒是輕量級的進程,同一類別執行緒共享程式碼和資料空間,每個執行緒有獨立的運行堆疊和程式計數器,執行緒切換開銷小
3.多重進程:在作業系統中能同時執行多個任務(程式)
4.多執行緒:在相同應用程式中有多個順序流同時執行
###################################################################################################################################### ######## Java的執行緒是透過java.lang.Thread類別來實現的,每個執行緒都是透過某個特定的Thread物件所對應的run方法來完成其操作的,從run方法稱為線程體。 ###### 在Java語言中建立執行緒有兩種方式:###### A.實現Runnable介面###### 2 .重寫Runnable介面中的run方法###### 3.建立實作類別的物件#### 5.請上start方法啟動執行緒###### B.繼承Thread類別###### 2.重寫Thread類別中的run方法## #### 3.建立執行緒物件######
三、兩個建立執行緒的比較
使用Runnable介面建立執行緒
形成清晰的模型
實作類別也可從其他類別繼承一些有用的屬性與方法
è直接繼承Thread類別創建執行緒
四、其他概念
1.後台處理(Background Processing):讓步給其他的程序,趁CPU有空閒,當沒有更高優先順序和更緊迫的任務需要處理的時候才能夠運行的任務,例如:打印文檔操作等 2.後台線程(Background Thread/Daemon Thread):以後台的方式運行的,通常是給其他的執行緒提供服務的一些次要的線程,例如:JVM中垃圾回收線程 3.使用者執行緒(User Thread):使用者建立的或是系統為使用者建立的執行緒
4.主執行緒(Main Thread):由應用程式運作的主線索,是使用者執行緒的一個
5.子執行緒(Sub Thread):在一個正在執行的執行緒中所建立的執行緒中所建立的新的線程
五、後台線程
Thread類提供的相關方法: public final boolean isDaemon()//判斷一個執行緒是否是後台執行緒 的所有使用者執行緒都已經停止運作的時候,無論是正常退出或執行出錯提前終止,JVM都會退出,可以理解為後台執行緒是不受重視的,是服務於使用者執行緒的
六、執行緒的生命週期
新狀態:新建立的執行緒物件
## 就緒狀態:當呼叫了一個方法後進入就緒狀態運作狀態:由JVM的執行緒調度器控制 阻斷狀態:當發生導致執行緒暫停執行緒的事件時,將由JVM的執行緒調度器調整為阻塞狀態,例如在執行緒中阻塞狀態進行IO操作或等待鍵盤輸入的資料等事件
終止狀態:當run方法中的程式都執行完畢,該執行緒將進入到終止狀態 注意:禁止將已經終止的執行緒再次啟動,一個執行緒也不允許被多次啟動 七、執行緒優先權Java線程的優先級用數字來表示,範圍從1到10
主線程的默認優先級為5,子線程的優先級默認和其父線程的優先級相同
Thread類別提供的相關方法
public final int getPriority()//取得執行緒的優先權
## 相關的靜態整數常數:
Thread.MIN_PRIORITY=1
PRIORITY=5
特別注意:程式開發中不能依賴執行緒優先權來控制執行緒執行的先後順序
##八、執行緒休眠暫停執行目前運作中的執行緒,使其進入阻塞狀態,待經過指定的「延遲時間」後再醒來並轉入到就緒狀態 Thread類別提供的相關方法:
# public static void sleep(long millis) public static void sleep(long millis,int nanos) ##九、執行緒讓步 讓運作中的執行緒主動放棄目前獲得的CPU處理機會,但不是讓該執行緒阻塞,而是使其轉入就緒狀態暫停:暫停目前運作中的執行緒,將其轉入至阻塞狀態,且不會自動恢復運轉
## 恢復:使已掛起的執行緒恢復運作 Thread類別提供的相關方法: public final void suspend()//執行緒掛起
##十一、執行緒同步與死鎖 1.多執行緒共享資料:在多執行緒的操作中,多個執行緒有可能同時處理同一個資源,這就是多執行緒中的共享資料。
2.執行緒同步:解決資料共享問題,必須使用同步,所謂同步就是指多個執行緒在同一時間段內只能有一個執行緒執行指定程式碼,其他執行緒要等待此執行緒完成之後才可以繼續執行。
執行緒同步,有下列兩種方法:
(1)同步程式碼區塊
//要同步的操作
}
(2)同步方法 public synchronized void method(){ 第七章:Socket網路程式設計 #一、什麼是電腦網路 將分佈在不同地理區域的電腦與專門的外部設備用通訊線路互連成一個規模大、功能強的網絡系統,從而使更多的計算機可以方便的互相傳遞信息,共享硬體、軟體和數據等資源#二、Socket 程式設計 兩個進程間可以透過一個雙向的網路通訊連線實現資料交換,此通訊連結的端點被稱為「套接字」(Socket) Socket通常用來實現Client-Server連線 在java.net套件中定義了兩個類別來實作連線的client與server三、Socket##程式設計的基本步驟 寫入的操作 4.關閉已開啟的IO串流與Socket物件 補充內容一:圖形使用者介面 一、Swing#AWT AWT:早期的Java包含一個抽象視窗工具箱(Abstract Window Toolkit,即AWT)的類別庫,用於基本的GUI編程,例如Button、Checkbox、List等,這些類別均為Component類別的子類別 AWT元件被視為重量級元件,因為它們依賴於本機系統來支援繪圖與顯示,每個AWT元件在本機視窗系統中都有相關的元件 S元件是用純Java程式碼編寫的,被稱為輕量級元件,它不依靠本機元件來支援它的顯示,而是完全由Java程式碼來繪製並顯示的,所以比通常的AWT元件效率要高得多 Swing:Swing庫想要新一些,為了避免重新命名,所有的Swing元件類別都以大寫字母J開頭。絕大多數的Swing元件都是JComponent類別的子類別 ##二、窗體容器 補充內容二:JDBC ##一、概述 大部分開發語言都提供了資料庫的存取 JDBC是由sun公司提供的一組介面和類別,封裝在java.sql包中,用於存取資料庫 資料庫廠商所提供的第三方驅動程式和類別包,可以存取特定的資料庫 二、JDBC JDBC(Java Database Connectivity)Java資料庫連接,支援Java應用程式連接資料庫 2.提供多樣化的數據庫連接方法 3.為各種不同的數據庫提供統一的操作界面 三、操作步驟 1.準備操作某種資料庫的準備工作 載入JDBC驅動程式 識別資料來源 2.建立與資料庫的連結管道 寫出sql語句 分配一個Statement物件 4.取得想要的結果,並處理結果為處理 ## 以相關對象,並釋放資源為 2、相關類別與介面 ## 驅動程式管理,提供了不同的資料庫驅動程式的管理功能 java.sql.Driver介面 ## 驅動程式:為了讓電腦作業系統能夠操作某項作業系統種硬體或軟體所提供的一種介面程式 資料庫驅動程式:應用程式操作某種資料庫所需的程式碼集合,可理解為介紹應用程式與資料庫互相認識的軟體模組 枚舉: 枚舉就是要讓某個類型的變數的值只能為若干個固定值中的一個,否則編譯器就會報錯,枚舉可以讓編譯器在編譯時就可以控制來源程式賦給的非法值,使用普通變數的方式在開發階段無法達成此目標。 在JDK1.5之後,使用關鍵字enum定義新的類型,稱為枚舉類型。 使用enum關鍵字定義的列舉類,實際上就相當於定義了一個類,而此類繼承了Enum類而已。
以上是java繼承的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!