iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0

#前言

通常面對大型專案或實際需求時,運用協同與別人合作的方法是最常見的,能提升程式碼的可靠性與維護上的方便。不過為了確保智慧財產或一些企業內機密資料不要過度被存取,程式設計師會透過前置修飾詞(Modifiers)去限制各類別、函數、屬性等存取或被存取範圍。

主要是希望利用前置修飾詞去控制別人能看到的內容,藉此保護資訊和程式的安全問題。

Modifier又會被分成兩類 :

  1. Access Modifiers (存取限制前置修飾詞)
  2. Non-Access Modifiers (非存取限制前置修飾詞)

-> 兩者差別是是否擁有存取的權限。非存取限制修飾詞雖然不具權限,但會提供其他功能性的關鍵詞。


Access Modifiers

  • 用在類別(class)上的 :
  1. public : 權限範圍最大,可以被任何類別存取。
  2. default : 可以被同一個套件的類別存取,其他則否。(沒指定修飾字時預設)
  • 用在函數、屬性、變數上的 :
  1. public
  2. default
  3. private : 權限範圍最小,僅能被同類別存取,通常運用在封包(Encapsulation)上。
public class First{
	private String name = "Chi";
	private String location = "Taipei";
	private int age = 20;
	
	static void student(){
		System.out.println("Your're junior.");
	}
}

public class Second{
	public static void main(String[] args){
        System.out.println(First.name);               //error
        System.out.println(First.location);           //error
		System.out.println(First.age);                //error
 
		First.student();                              //error
	}
}

-> 因為類別First中變數的修飾字是private ,所以不能在另外一個類別中使用。

  1. protected : 除了同套件的類別外,還能被其extends之子類別(subclass)存取。
public class Student {
  protected String name = "Chi";
  protected int grade = 41;
  protected char gpa = 'E';
}

class college extends Student {
  private int graduation = 2024;
  public static void main(String[] args) {
    college newobj = new college();
    System.out.println("Name: " + newobj.name);
    System.out.println("Grade: " + newobj.grade);
    System.out.println("gpa: " + newobj.gpa);
    System.out.println("Graduation Year: " + newobj.graduation);
  }
}

-> 第一個類別中的變數修飾字為protected,所以繼承它類別的college可以直接使用。


Access Modifier對照表

https://ithelp.ithome.com.tw/upload/images/20221004/20151216uzg7jLFj99.png
(此圖製作參考Java備忘筆記-修飾子比較表)


# Non-Access Modifiers

  • 用在類別(class)上的:
  1. final : 用此修飾字宣告之類別,不能被其他類別繼承。
  2. abstract : 此宣告類別不能用來創造物件,代表無建構子,可用繼承的方式儲存內容。
abstract class Main {
  public String name;
  public abstract void salary(); // abstract method
}

/*abstract Main(){               //Constructor : error
	String name = "Jason"
}*/

// Subclass (inherit from Main)
class employee extends Main {
  String name = "Jason"
  public void salary() { 
    System.out.println("Salary : 45000");
  }
}

程式解析 : 因為我們前置修飾子抽象(abstract)宣告之類別不能創造物件,只能透過繼承方式先設定變數函數屬性,再者到不同類別去設定物件。

  • 用在函數、屬性、變數上的 :
    finalstaticabstracttransientsynchronizedvolatile

-> 此處部分關鍵字較少用到,不多做解釋。有興趣可以參考EDUCBA官方網站介紹。

以上內容若有錯誤或任何問題,煩請不吝嗇告知,謝謝您!!!/images/emoticon/emoticon77.gif


上一篇
Day 18 : 建構子
下一篇
Day 20 : 封裝與實作
系列文
30天Java由淺入深30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言