iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

物件導向的觀念中,「封裝」就是物件內容的隱藏過程,哪些成員可直接被讀取,哪些成員由限定對象來讀取等等。

要取得被封裝(隱藏)的屬性或方法,可透過統一方法或介面實作(interface implements)來取得,以維護物件資源的完整性與存取安全

簡單來說就是將該隱藏的隱藏,該公開的公開需要透過存取控制詞來實作。

封裝的好處

  1. 資料隱藏:通過將資料設定為私有,防止外部程式碼直接存取和修改物件的屬性。這樣可以防止不必要的干擾和錯誤。
  2. 控制存取:通過提供公開方法(Getter和Setter)來控制屬性的存取和修改,可以在方法內部添加額外的邏輯來確保資料的一致性和有效性。
  3. 提高安全性:封裝可以增加資料的安全性,防止非法存取和修改。只有經過驗證的操作才能修改物件的內部狀態。
  4. 減少依賴:外部程式碼不需要了解物件的內部實作細節,只需呼叫公開方法來與物件交互。這減少了程式碼之間的耦合度,使程式碼更易於維護和修改。
  5. 易於維護和擴展:封裝使程式碼更模組化,每個類別都可以獨立開發和測試。這使得在不影響其他部分的情況下修改或替換類別變得更容易。

在Java中,用來封裝的技術有:

  1. package / import
  2. 存取修飾元(public / protected / (default) / private)
  3. static / final
  4. this
  5. 多載(Overload)
  6. 類別(屬性 / 方法 / 與建構子)

package / import

package(套件):

放置性質相似的class,在同一package之內的class名稱不可重覆。

大量的類別可能會發生同名的情形,所以Java 引入了套件的機制,解決命名衝突、檔案管理等問題。

宣告套件的方法:

在檔案的第一行:package 套件名稱;

慣用的命名方式為:
(1)小寫

(2)公司的網址反轉,即由左向右,由大到小,例:com.google

規則

  1. JVM要裝載類別時,會依次搜尋CLASSPATH環境變數所指定的目錄,尋找目錄下是否包含該類別,並在目錄下尋找是否包含同名的.class檔。
  2. 同套件中的類別不必在同目錄下,例如有com.Person 和 com.PersonTest兩個類別,可以一個在C槽的某個位置,一個在D槽的某個位置,只要在CLASSPATH環境變數力包含這兩個路徑即可,JVM就會自動搜尋CLASSPATH下的子路徑,把他們當同一個套件下的類別來處理。

在 Java 中規定,.class 檔案存在的地方必須與套件的命名結構相對應

https://ithelp.ithome.com.tw/upload/images/20231001/20163139MRGacfnFWe.png

package com.demo01;

public class HelloTest {

	public static void main(String[] args) {
		//可以直接取用不用添加套件前綴
		Hello hello = new Hello();

	}

}

如果需要使用不同套件中的其他類別時,總是需要使用該類別的全名,是一件麻煩事

所以為了簡化程式 Java引入了下面要提到的import 關鍵字。

import(載入):

在 class 中註明 import,表示可讀取不同 package 的class,但指定要被載入的 class 必須是public。

宣告套件的方法:

在原始檔案的第二行寫下:

  1. import 套件名稱.類別名稱;
  2. import 套件名稱1.套件名稱2.*;
  3. import static 套件名稱.類別名稱.方法;

所以可以將上面引入Welcome類別改成以下

package com.demo01;

import com.demo01.sub.Welcome;

public class HelloTest {

	public static void main(String[] args) {
		
		Hello hello = new Hello();
		
		Welcome welcome = new Welcome();

	}

}

如果堅持使用其他類別的全名,也無需使用import 語句。

注意:Java預設為所有原始檔匯入java.lang套件下的所有類別,所以我們才可以在使用String、System時,不用import 來匯入

但也有一定要使用全名的情況,例如:java.sql 和 java.util 套件下都包含了Date類別

import java.util.*;
import java.sql.*;

在這種情況下,為了讓參照明確就需要使用類別的全名

java.sql.Date date = new java.sql.Date();

還有另一種靜態匯入的語法:用來匯入指定的類別的某個或全部的靜態成員變數、方法(static 在後面會有更詳細的說明)

import static java.lang.Math.*;

那我們封裝今天就了解到這邊,明天再繼續了解封裝的其他技術!


上一篇
Day 15 類別和物件
下一篇
Day 17 封裝(Encapsulation)II
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言