python:從入門到放棄 11 函式遞迴
封裝
將抽象性函式介面的實現細節部分包裝、隱藏起來的方法
封裝可以被認為是一個保護屏障,防止該類的程式碼和資料被外部類定義的程式碼隨機訪問。
要訪問該類的程式碼和資料,必須通過嚴格的介面控制。
封裝最主要的功能在於我們能修改自己的實現程式碼,而不用修改那些呼叫我們程式碼的程式片段。
適當的封裝可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。
如何封裝
首先,我們需要修改屬性的可見性來限制對屬性的訪問,一般用private
關鍵詞進行限制。
像這樣我就封裝了兩個欄位,封裝之後我們不能在其他類中自由呼叫,因為它不是公開的屬性!
但是我們如何讓他可以修改,並且還保持安全性呢?
我們可以對他進行重構,封裝成方法,在IDEA中,提供了快捷的右鍵,可以快速生成。
執行一鍵封裝後效果如下。
public class Demo {
private String i;
private int x;
public static void main(String[] args) {
}
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
大家可能注意到了,封裝的方法是public
修飾的,所以public
方法是外部類訪問該類成員變數的入口,這些方法被稱為getter和setter方法。
繼承
何為繼承
第二大特徵——繼承!
何為繼承?字面上理解,子承父業,即為繼承。
那其實Java也是一樣,一個(多個)類繼承另一個類的特徵,我們稱之為繼承。
如何繼承
我們上面就說過,繼承要子承父業,那如何定義父親與兒子呢?
我們的extends
關鍵詞可為類指定它的父親。
在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。
/**
* 父類
*/
public class Demo {
}
/**
* 子類
*/
class son extends Demo{
}
這段程式碼是單繼承,只有一個子一個父,而我們的Java是沒有多繼承的,但是有個關鍵詞可以變相的定義多繼承——implements
這裡就不細說了。
繼承到底有什麼用呢?
看這裡,son類是子類,它裡面並沒有輸出語句,但是他卻輸出了父類裡面的語句。
相當於它繼承了父親的財產。而假設我們將多個類的共同的放在父類裡面,我們是不是可以節省很多程式碼呢?
那麼問題來了,我如果想讓父類中的一個屬性或者方法啥的不被繼承怎麼辦?
我們可以使用final
來定義不想被繼承的方法或者屬性,如下程式碼塊一樣。
/**
* @author woo-m
*/
/**
* 父類
*/
public class Demo {
final static void main(String[] args) {
System.out.println("父類");
}
}
/**
* 子類
*/
class son extends Demo{
}
同名情況下,如何選擇父類與子類
/**
* 定義動物類
*/
class Animal {
void show() {
System.out.println("動物");
}
}
/**
* 狗類定義動物類為父類
*/
class Dog extends Animal {
這裡,你可以看到,我這裡使用this
來指向自己類中定義的show
方法,而super
可以指向父類的show
方法。
這裡就不多講,自己理解!
多型
何為多型
欲解其用,必知其理。
我們先來看看,啥是多型!
-
現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。
-
Java作為面向物件的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的物件便既是Student,又是Person。
也就是說,你有許許多多的特點,你的特點可以分為多個類,你可以是人,可以是學生,同時你也是程式設計師。
多型體現為父類引用變數可以指向子類物件,不過,前提條件:必須有子父類關係。
多型優勢
-
消除型別之間的耦合關係
-
可替換性
-
可擴充性
-
介面性
-
靈活性
-
簡化性
多型存在的三個必要條件
-
繼承
-
重寫
-
父類引用指向子類物件:Parent p = new Child();
使用多型
多型這裡難以文字描述,需要自己悟出來,我就不寫了。