>[success] # 多態
1. 多態主要指同一種事物表現出來的多種形態
>[danger] ##### 多態語法格式
~~~
父類類型 引用變量名 = new 子類類型();
~~~
例如
~~~
Shape sr = new Rect()
~~~
>[danger] ##### 多態特點
1. 當父類類型的引用指向子類類型的對象時,父類類型的引用可以直接調用**父類獨有的方法**
2. 當父類類型的引用指向子類類型的對象時,父類類型的引用不可以直接調用**子類獨有的方法**
3. 對于父子類都有的非靜態方法來說,編譯階段調用父類版本,運行階段調用子類重寫的版本(**動態綁定**)
4. 對于父子類都有的靜態方法來說,編譯和運行階段都調用**父類版本**
>[danger] ##### 案例
~~~
1.編程實現Shape類的封裝,特征有:橫縱坐標,要求提供打印所有特征的方法。
2.編程實現Rect類的封裝并繼承自Shape類,特征有:長度和寬度。
3.編程實現ShapeRectTest類,在main方法中分別創建Shape和Rect類型對象并打印特征。
~~~
* 父類Shape
~~~
public class Shape {
private int x;
private int y;
public Shape() {
}
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void show(){
System.out.println("橫坐標"+getX()+"縱坐標"+getY());
}
}
~~~
* 子類
~~~
public class Rect extends Shape{
private int len;
private int wid;
public Rect() {
}
public Rect(int x, int y, int len, int wid) {
super(x, y);
this.len = len;
this.wid = wid;
}
public int getLen() {
return len;
}
public void setLen(int len) {
if(len>0){
this.len = len;
}else{
System.out.println("長度不能為負數");
}
}
public int getWid() {
return wid;
}
public void setWid(int wid) {
if(wid>0){
this.wid = wid;
}else{
System.out.println("寬度不能為負數");
}
}
@Override
public void show() {
super.show();
System.out.println("長度"+getLen()+"寬度是"+getWid());
}
}
~~~
* 運行入口
~~~
public class ShapeRectTest {
// 此時傳入參數不一定是Rect 或者是Shape其他子類型,但如果類型寫死需要
// 利用重載寫多次對應類型,利用了多態此時一個入口方法即可
public static void getShow(Shape sr){
sr.show();
}
public static void main(String[] args){
// 聲明 Shape 類型
Shape shape = new Shape(1,2);
shape.show();
System.out.println("---------------------");
// 聲明 Rect 類型
Rect rect = new Rect(3,4,5,6);
// 如果子類沒有重寫父類的show 方法此時用是父類show方法
rect.show();
System.out.println("---------------------");
// 聲明 Shape 類型指向 Rect
Shape sr = new Rect(7,8,9,10);
// 如果子類沒有重寫父類的show 方法此時用是父類show方法
// 如果子類重寫父類的show ,在編譯階段使用是父類show方法,在執行階段執行的子類show方法
sr.show();
// 使用多態特性
ShapeRectTest.getShow(new Rect(7,8,9,10));
ShapeRectTest.getShow(new Shape(7,8));
}
}
~~~
>[danger] ##### 多態意義
1. 多態的實際意義在于屏蔽不同子類的差異性實現通用的編程帶來不同的效果
2. 使用多態的格式,此時父類類型引用直接調用的所有方法一定是父類中擁有的方法,若以后更換子類時,只需要將new關鍵字后面的子類類型修改而其它地方無需改變就可以立即生效,從而提高了代碼的可維護性和可擴展型。
~~~
// 如果以后代碼編寫時候使用多態向上轉型后,此時未來代碼將要有改動更換類時候
// 只需將new 部分改動例如 Shape s = new Rect() 改 Shape s = new Clire(); 但下面的調用方法
// 無需更調用 或作為方法參時候去給改整體
Shape s = new Rect()
s.getShow()
~~~
* 缺點
1. 父類引用不能直接調用子類獨有的方法,若調用則需要強制類型轉換
- windows -- 環境變量
- Vscode -- 編寫java
- 初始java
- java -- 關鍵字
- 編寫第一個java程序
- java -- 注釋
- 計算機存儲 -- 進制
- java -- 類型
- java -- 變量
- 數字類型
- 布爾類型
- 字符類型
- 類型轉換
- 雙等比較是什么
- java -- 運算符
- 算數運算符
- 字符串拼接
- 關系/比較運算符
- 自增減運算符
- 邏輯運算符
- 三目運算
- 賦值運算符
- 移位運算符
- 位運算符
- 運算符優先級
- java -- 流程控制語句
- if /else if /if -- 判斷
- switch case分支結構
- for -- 循環
- 用雙重for循環
- while -- 循環
- do while -- 循環
- 案例練習
- java -- 數組
- 數組的存儲
- 數組的增刪改查
- 數組的特點
- 數組案例
- 二維數組
- 數組的工具方法
- java -- 方法
- java -- 方法的重載
- java -- 方法的調用流程
- java -- 類方法傳參注意事項
- java -- 方法練習案例
- 對比 return break continue
- for each循環
- java -- 基礎練習
- java -- 面向對象
- java -- 創建類和對象
- java -- 訪問控制符
- java -- 類成員方法
- java -- 構造方法
- java -- this
- java -- 封裝
- java -- 對象內存圖
- java -- 創建對象案例
- java -- static
- java -- 繼承
- super -- 關鍵字
- java -- 構造塊和靜態代碼塊
- java -- 重寫
- java -- final
- java -- 多態
- java -- 抽象類
- java -- 接口
- 引用類型數據轉換
- 綜合案例
- java -- 內部類
- java -- 回調模式
- java -- 枚舉類型
- java -- switch 使用枚舉
- java -- 枚舉方法使用
- java -- 枚舉類實現接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 遞歸練習
- java -- 設計模式
- 單例模式
- java -- 注解
- java -- 元注解
- Java -- 核心類庫
- java -- 處理字符串
- Java -- String
- String -- 常用方法
- String -- 正則
- Java -- StringBuilder 和 StringBuffer
- 知識點
- Java -- StringJoiner 字符串拼接
- 練習題
- 字符串的總結
- Java -- 包裝類
- Integer
- Double
- Boolean
- Character
- java -- 集合類
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 獲取當前時間戳
- Java -- 異常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法