JAVA訪問控制權限
阿新 • • 發佈:2021-01-02
JAVA 程式設計思想看到第六章 訪問許可權控制 第一句話就是 : 訪問控制(或隱藏具體實現) 與 "最初的實現並不恰當"
為什麼需要訪問許可權控制?
現實的問題就是我寫的程式如果需要修改重構,而其他地方又依賴於我當前的呼叫與輸出。使用許可權控制,把不變和經常改變的分開來解決這個問題。
(1)為了使使用者不要觸碰那些他們不該觸碰的部分,這些部分對於類內部的操作時必要的,但是它並不屬於客戶端程式設計師所需介面的一部分。
(2)為了讓類庫設計者可用更改類的內部工作方式,而不必擔心會對使用者造成重大影響。
主要原因是為了提高程式碼的靈活性。訪問許可權控制的使用主要就是為未來的更新和維護留有餘地而出現的機制,核心思想就是"程式碼不是面向現在的,也不是面向物件的,而是面向未來的!"
在Java中,我們使用package來解決名字衝突。引入package,可以把相同功能單元的類放在一起,避免其他地方錯誤呼叫。
package 包的作用以及注意事項:
Java內建的package機制是為了避免class命名衝突;
JDK的核心類使用java.lang包,編譯器會自動匯入;
儘量遵守“包的名稱對應目錄路徑的規則”
為了避免名字衝突,我們需要確定唯一的包名。推薦的做法是使用倒置的域名來確保唯一性。
要注意不要和java.lang包的類重名,即自己的類不要使用這些名字。
要注意也不要和JDK常用類重名。
包作用域:
位於同一個包的類,可以訪問包作用域的欄位和方法。
包的使用:
在寫import的時候,可以使用*,表示把這個包下面的所有class都匯入進來(但不包括子包的class)(不推薦,匯入多個包後很難看出來具體程式使用的類到底是哪個包的)
// 匯入System類的所有靜態欄位和靜態方法
import static java.lang.System.*;
如果是import 引入的是具體類名,JAVA編譯器將直接根據完整類名找到這個class
如果是簡單類名
優先 查詢當前package是否存在這個class
其次 查詢import的包是否包含整個class
隨後 查詢java.lang包是否包含整個class
/*
package test;
import java.text.Format;
public class Main {
public static void main(String[] args) {
java.util.List list; // ok,使用完整類名 -> java.util.List
Format format = null; // ok,使用import的類 -> java.text.Format
String s = "hi"; // ok,使用java.lang包的String -> java.lang.String
System.out.println(s); // ok,使用java.lang包的System -> java.lang.System
MessageFormat mf = null; // 編譯錯誤:無法找到MessageFormat: MessageFormat cannot be resolved to a type
}
}
*/
作用域:
大多數程式設計語言都提供了“作用域”(Scope)的概念。
對於在作用域裡定義的名字,作用域同時決定了它的“可見性”以及“存在時間”。在 C,C++和 Java 裡,作用域是由花括號的位置決定的。(常年寫PHP的同學需要注意)
區域性變數:
在方法內部定義的變數稱為區域性變數,區域性變數作用域從變數宣告處開始到對應的塊結束。
private 私有 也就是說除了包含該成員的類,其他任何類都無法訪問這個成員。這樣你就可以隨意修改該成員,而不必考慮是否會影響到其他類。
推薦把private方法放到後面,因為public方法定義了類對外提供的功能,閱讀程式碼的時候,應該先關注public方法。
protected 受保護的 作用於繼承關係,方便子類訪問基類成員。
public 公共的 定義為public的class、interface可以被其他任何類訪問。
總結:
如果不確定是否需要public,就不宣告為public,即儘可能少地暴露對外的欄位和方法。
Java內建的訪問許可權包括public、protected、private和package許可權;
Java在方法內部定義的變數是區域性變數,區域性變數的作用域從變數宣告開始,到一個塊結束;
final修飾符不是訪問許可權,它可以修飾class、field和method;
一個.java檔案只能包含一個public類,但可以包含多個非public類。
final 其實不是訪問許可權 與訪問許可權並不衝突 通常指 “這是無法改變的”
final可作用於 資料 方法 和 類
使用final修飾class 可以阻止class被繼承。
使用final修飾method 可以阻止被子類複寫。
使用final修飾field 可以阻止被重新賦值。
變數是基本型別:final修飾指的是基本型別的資料值不能發生改變
變數是引用型別:final修飾指的是引用型別的地址值不能發生改變,但是地址裡面的內容是可以發生改變的。