Java - OOP 物件導向特性

By sunwc 2023-03-20 Java

encapsulation封裝性:

Java提供了4種存取修飾符private ,不寫(default), protected , public來修飾類別及類別的內部結構,體現類別及內部結構在被存取時的可見性(visible)的大小

inheritance繼承性:

減少程式碼的冗餘,也方便功能的擴展,先有一個類別(子)去繼承另一個類別(父),而有了父類與子類的關係,子類可以使用父類的所有功能,且子類還可以在父類的基礎之上擴展其他功能 => is-a 關係(子類 is a 父類)

polymorphism多型性:

  • 類別的繼承關係
  • 子類要覆寫 (Override) 父類的方法,就能透過父類別使用子類別覆寫的功能
  • 典型例子:資料庫連線 父、子類的設計
  • 物件的多型性:只適用於方法 (Method) => 又稱 存取虛擬方法 ;但不適用屬性 (Field)!

多型 例子

package day08.oop;

class Person {
   int age;
   int name;

   public Person() {
   	this.age = 1;
   }

   public void eat() {
   	System.out.println("人吃飯");
   }

   public void sleep() {
   	System.out.println("人睡覺");
   }
}

class Student extends Person {

   int age;

   public Student() {
   	this.age = 10;
   }

   @Override
   public void eat() {
   	System.out.println("學生要吃營養的食物");
   }

   @Override
   public void sleep() {
   	System.out.println("學生要睡飽才會長高");
   }
   
   public void study() {
   	System.out.println("學生認真學習!");
   }

}

public class PolymorphismTest {

   public static void main(String[] args) {
   	Person p1 = new Student();
   	p1.eat();
   	p1.sleep();
   	
   	// 會存取到父類別的屬性
   	System.out.println("age="+p1.age);
   	
   	System.out.println("====================");
   	
   	// 如何才能使用 p1變數 存取子類別特有的屬性與方法?
   	// 使用向下轉型:使用強制轉型符
   	if (p1 instanceof Student) {
   		// 為了避免轉型失敗拋出ClassCastException,先用 instanceof 關鍵字判斷
   		
   		Student student = (Student) p1;
   		// 會存取到子類別的屬性
   		System.out.println("age="+student.age);
   		student.study();
   		
   		student.sleep();
   	}
   }
}

輸出結果:

學生要吃營養的食物
學生要睡飽才會長高
age=1
====================
age=10
學生認真學習!
學生要睡飽才會長高

Overload (多載) vs. Override (覆寫)

  • Overload (概念可稱同名方法) 在編譯 (compile) 時期就會去檢查 方法宣告的參數列表 是否符合 多載 的規定
  • Override 在編譯 (complie) 時期 會先以父類別變數去存取父類別方法來判斷編譯通不通過,直到執行 (run) 時期 若使用父類別變數存取的方法 子類別有覆寫 (多型概念),則會是在執行時才在heap區去存取子類別覆寫的方法

PS. 編譯時期看左邊、執行時期看右邊