Java基礎語法(10)-面向物件之三大特徵
阿新 • • 發佈:2020-04-03
> title: **Java基礎語法(9)-面向物件之類的成員**
>
> blog: [CSDN](https://blog.csdn.net/BenCoper)
>
> data: [Java學習路線及視訊](https://www.cnblogs.com/bencoper/p/12558477.html)
### 1.面向物件特徵--封裝
1. **為什麼需要封裝?封裝的作用和含義?**
我要用洗衣機,只需要按一下開關和洗滌模式就可以了。有必要了解洗衣機內部的結構嗎?有必要碰電動機嗎?
我要開車,…
隱藏物件內部的複雜性,只對外公開簡單的介面。便於外界呼叫,從而提高系統的可擴充套件性、可維護性。通俗的說,把該隱藏的隱藏起來,該暴露的暴露出來。這就是封裝性的設計思想。
2. **資訊的封裝和隱藏**
Java中通過將資料宣告為私有的(private),再提供公共的(public)方法:
getXxx()和setXxx()實現對該屬性的操作
```java
class Animal {
private int legs; // 將屬性legs定義為private,只能被Animal類內部訪問
public void setLegs(int i) {
if (i != 0 && i != 2 && i != 4) {
System.out.println("Wrong number of legs!");
return;
}
legs = i;
}
public int getLegs() {
return legs;
}
}
```
```java
public class Zoo {
public static void main(String args[]) {
Animal xb = new Animal();
xb.setLegs(4); //
System.out.println(xb.getLegs());
}
}
```
3. 四種訪問許可權修飾符
Java許可權修飾符public、protected、(預設)、private置於類的成員定義前,用來限定物件對該類成員的訪問許可權。
| **修飾符** | **類內部** | **同一個包** | **不同包的子類** | **同一個工程** |
| ---------- | :--------: | :----------: | :--------------: | :------------: |
| private | Yes | | | |
| (預設) | Yes | Yes | | |
| protected | Yes | Yes | Yes | |
| public | Yes | Yes | Yes | Yes |
對於class的許可權修飾只可以用public和default(預設)。
public類可以在任意地方被訪問
default類只可以被同一個包內部的類訪問
### 2.面向物件特徵--繼承
1. **為什麼要有繼承?**
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。
此處的多個類稱為子類(派生類),單獨的這個類稱為父類(基類或超類)。可以理解為:“子類 is a 父類”
2. **類繼承語法規則:**
class Subclass extends SuperClass{ }
3. **作用:**
- 繼承的出現減少了程式碼的冗餘,提高程式碼的複用性
- 繼承的出現,更有利於功能的擴充套件
- 繼承的出現讓類與類之間產生了關係,提供了多型的前提。
4. **規則:**
- Java只支援單繼承和多層繼承,不允許多重繼承
- 一個子類只能有一個父類
- 一個父類可以派生出多個子類
5. **單繼承與多層繼承舉例**
### 3.面向物件特徵-多型性
1. **多型的作用**
- 父類的引用指向子類的物件
2. **規則**
- 編譯時,看左邊;執行時,看右邊。
3. **向上轉型**
- 在Java中,子類的物件可以替代父類的物件使用
```java
Person p = new Student();
Object o = new Person(); //Object型別的變數o,指向Person型別的物件
o = new Student(); //Object型別的變數o,指向Student型別的物件
```
- 子類可看做是特殊的父類,所以父類型別的引用可以指向子類的物件:向上轉型(upcasting)。
4. **動態繫結**
- 編譯時e為Person型別,而方法的呼叫是在執行時確定的,所以呼叫的是Student類的getInfo()方法
```java
public class Test {
public void method(Person e) {
e.getInfo();
}
public static void main(Stirng args[]) {
Person e = new Person();
e.getInfo();
}
```
5. **instanceof關鍵字**
- 作用:用來判斷某個物件是否屬於某種資料型別。
- 注意: 返回型別為布林型別
```java
Fu f1=new Zi();
Fu f2=new Son();
if(f1 instanceof Zi){
System.out.println("f1是Zi的型別");
}
else{
System.out.println("f1是Son的型別");
}
```
6. 向下轉型
- 一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用型別轉為子類引用各型別
- 子類型別 變數名=(子類型別) 父類型別的變數;
```java
public class Main {
public static void main(String[] args) {
Person person = new Superman();
Superman s = (Superman)person; //向下轉型
s.sleep();
s.fly();
s.eat();
}
}
```
### 4.結語
2020-3-31: [Java基礎語法(8)-陣列中的常見排序演算法](https://www.cnblogs.com/bencoper/p/12616335.html)
2020-3-31: [Java基礎語法(9)-面向物件之類的成員](https://www.cnblogs.com/bencoper/p/12616347.html)
- 今日好文推薦
- [一文帶你入門Java Stream流,太強了](https://blog.csdn.net/qing_gee/article/details/105238960)
- [學歷低,無法勝任工作,大佬告訴你應該怎麼做](https://blog.csdn.net/qing_gee/article/details/104628849)
- 今日資料推薦
- [我的Java自學之路](https://how2j.cn?