Java4Android自學記錄(19):包和訪問權限

突然發現一點,java 程序中貌似只有以 .java 爲後綴的文件,而 C++ 中有 .cpp 和 .h 文件。

1 目錄及資源索引

  Java4Android自學過程目錄及資源索引

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 訪問權限

  訪問權限從總體上可以分爲四大類,如下:

  1. public:公共權限
  2. private:私有權限
  3. default:包級別訪問權限
  4. 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 總結

  • 一個類和一個成員變量或成員函數的權限應該儘可能得小,這樣才能體現面向對象程序的封裝性;
  • 瞭解了包和基本的四種訪問權限,及各自不同的用法與區別;
  • 瞭解了包的使用,創建方法;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章