突然發現一點,java 程序中貌似只有以 .java 爲後綴的文件,而 C++ 中有 .cpp 和 .h 文件。
文章目錄
1 目錄及資源索引
2 參考資料
參考網址:菜鳥教程 - Java 包
3 什麼是包
3.1 概念及理解
通俗的理解,軟件包,就是裏邊存放不同類的文件夾。主要作用就是,在不同的文件夾內,可以存放名字相同的類,從而避免同名類造成的衝突。
用於區別類名的命名空間。
3.2 包的作用
查閱資料,總結如下:
- 把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。
- 如同文件夾一樣,包也採用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字衝突。
- 包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
類似我們在編寫一個類,需要調用其他類時,要在文件開頭包含(import)對應類所在的軟件包。
3.3 如何創建包
在文件開頭使用 package 關鍵字,再加上對應的包名即可。注意:包名可以是多級目錄。
package com.zhao.person
上述代碼會先創建一個 com 文件夾,在此目錄下有 zhao 文件夾,然後纔是 person 文件夾,在這個文件夾中,纔有我們要找的類;
3.4 包的命名方式
這個只是一般情況下的命名要求,爲的是統一風格,簡潔美觀,通俗易懂。
- 要求包名所有的字母都要小寫;
- 包名一般情況下,是你的域名倒過來寫;(類比網站)
注意:包名中一旦加上 “.” ,就會發生變化,目錄會變成遞增的。
3.5 小結
- 這種感覺就像C++中,類名::函數名一樣,如果java中有對應的軟件包,那麼一個類的全名應該是“包名” + “類名”。
- 軟件包爲 Java 類提供了命名空間;
- 打包需要使用 package 指令;
- 不同的類,在不同的命名空間中是可以重名的。
4 訪問權限
訪問權限從總體上可以分爲四大類,如下:
- public:公共權限
- private:私有權限
- default:包級別訪問權限
- protected:受保護權限
個人感覺,跟C++中的權限大同小異,但是C++是修飾類中的成員變量或成員函數的,不像這個修飾的是軟件包。
4.1 Public權限
public 英文翻譯過來就是 公共的、公衆的。從字面意思就很好理解啦。
- 既可以修飾類,又可以修飾成員變量,成員函數;
- 原來只是要求儘量的把類名和文件名寫一樣,方便調試;但是如果變成公共的類(public修飾),則類名和文件名必須完全一樣;
- 如果兩個類分別在兩個不同的包中,類A如果不是公共的(public),則類B是找不到類A的,自然也就無法使用;
- 在不同的包當中,一個類要想訪問另一個類,這個類要有public權限;要訪問成員函數或成員變量的話,則成員變量或成員函數也需要有 public 權限。
4.2 Private權限
private 英文翻譯過來就是 私有的、私自的、自用的。同樣的從字面意思就很好理解啦。
- 不管這兩個包,在不在同一個包中,如果是 private ,則只能在這個類當中使用。
也就是,如果一個類/一個成員變量/一個成員函數是 private 私有權限,則只能在此類中使用。
4.3 Default權限
這個剛上來我也有點蒙逼,根本沒見過這個是什麼權限。其實前邊什麼都不寫,就默認是 default 權限,其實從英文翻譯過來也不難理解啦,這個單詞就是 默認、預設、預置的意思啦。
- 如果 兩個類在同一個包中,那麼可以任意的使用,沒有問題。
- 如果類前邊什麼都不寫,成員函數,成員變量也一樣。
- 如果不在同一個包中,則在使用的時候,必須加上包名。
4.4 Protected權限
顧名思義,這個單詞是 保護的意思。那究竟是來保護什麼的呢?
看如下兩段代碼,子類 Student 繼承父類 Person ,父類是 public 權限,但是其中的兩個變量是默認(default)權限,且這兩個類,不在同一個包中,首先父類代碼如下:
子類中調用父類成員變量如下:
結果編譯出現如下錯誤,提示沒有權限?
那是不是意味着:如果子類和父類不在同一個包當中,則子類無法繼承到父類當中的 default 權限的成員變量和成員函數。
回顧剛剛的錯誤,只是說不是公共的,無法從其他包訪問。如果是沒有繼承到 name 的話,則報出來的錯誤應該是找不到 name 這個變量。也就是說權限不對,不能使用。
因此:子類可以繼承到,但是由於權限問題,所以在子類中無法使用,而不是沒有。這個是很關鍵的,不是沒有,而是有,但是由於權限問題,用不了。
修改之前描述:如果子類和父類不在同一個包當中,子類可以繼承到父類當中的 default 權限的成員變量和成員函數,但是由於權限不夠,無法使用。
那麼問題來了,如何在不同包的情況下,讓繼承的子類也能使用父類的變量呢?當然,定義成 public 權限,是肯定沒問題的,除此之外,還可以使用 protected 權限。
- protected 擁有和 default 一樣的功能,但是該權限只能修飾 成員變量和成員函數;
- protected 權限還允許誇包繼承。
到這裏就基本清楚了,protected 就是爲了保護子類的!
4.4 小結
- public:可以修飾類,成員變量和成員函數;沒有任何限制,同一個包當中,或者不同包當中的類都可以自由訪問。
- private:可以修飾成員變量和成員函數;只能在本類當中使用。
- default:(不寫權限修飾符,就是default權限)可以修飾類,成員變量和成員函數;在同一個包當中,可以自由訪問。
4.4.1 public 與 default 的區別
看上邊的小結,發現 public 與 default 貌似沒啥區別啊,然後去百度了一下,參考區別
大概意思就是 public 可以被其他所有類訪問;但是 default 只針對同一包中的類。
4.4.2 public 與 protected 的區別
如果把變量聲明爲 public ,則在此類外部,都可以使用這個變量;
而 protected ,則只有這個類的子類,纔可以使用這個變量。
4.4.3 幾種權限排序
public > protected > default > private
5 包的導入問題
直接在文件開頭使用 import 關鍵字即可,如果想導入某一個包中的所有類,則可以考慮使用通配符“*”
import com.zhao.*
6 總結
- 一個類和一個成員變量或成員函數的權限應該儘可能得小,這樣才能體現面向對象程序的封裝性;
- 瞭解了包和基本的四種訪問權限,及各自不同的用法與區別;
- 瞭解了包的使用,創建方法;