多态概述:
為三大特性之一
先講下封裝與繼承:封裝就是把過程和資料包圍起來,對資料的通路隻能通過已定義的界面,他把實作的細節隐藏起來,比如你在Java中去實作一個類,這個類提供了一些功能方法,你隻需要知道傳遞到什麼樣的參數,會達到什麼樣的效果,實作細節在類中定義好了。進而實作代碼子產品化;而繼承可以擴充已存在的代碼子產品,而且就是為了代碼重用。那麼多态除了代碼的複用,還可以解耦。而且為什麼要解耦?耦合度是子產品與子產品之間,代碼與代碼之間的關聯度,通過對系統的分析把他分解成一個又一個子子產品,子子產品提供穩定的接口,達到降低系統耦合度的目的,子產品與子產品之間盡量使用子產品接口通路,而不是引用其他子產品的的成員變量。
多态好處:
1、程式不必為每一個派生類編寫調用功能,隻需要對抽象基類進行處理即可。大大提高程式的複用性。//繼承
2、派生類的功能可以被基類的方法引用或引用變量所調用,這叫做向後相容,可以提高可擴充性。//多态的真正作用。現實事事物表現出多種形态,如汽車,是代步工具的一種,則一個具體的一輛車五菱宏光既是是汽車,又是代步工具,即出現兩種形态
簡單粗暴:
父類型引用子類型的對象。
同一操作作用于不同的對象,可以産生不同的結果。
對同一個對象表現出不同的形态。
Java是面向對象的語言,同樣可以描述一個事物的多種形态。如汽車類繼承了代步工具類,一個汽車的對象便既是汽車又是代步工具。
多态展現為父類引用變量可以指向子類對象
前提條件:必須有子父類關系
注意:在使用多态後的父類引用變量調用方法時,會調用子類重寫後的方法。
多态的定義與使用格式
定義格式: 父類類型 變量名 = new子類類型()
了解:
多态是同一行為具有不同的表現形式或者形态的能力。
多态就是一個接口,使用不同的執行個體而執行不同操作。
多态成員的特點
1、多态成員變量:編譯和運作都看左邊
Fu f = new Zi();
sout(f.num);//f是Fu的值,隻能取到父中的值
2、多态成員方法:編譯看左邊,運作看右邊
Fu f1=new Zi();
sout(f1.show());//f1的門面類型是Fu,但是實際類型是Zi,是以調用的是重寫後的方法。
3、instanceof關鍵字
作用:用來判斷某個對象是否屬于某種資料類型。
注意:傳回類型為布爾類型
使用案例:
Fu f1=new Zi();
Fu f2=new Son();
if(f1 instanceof Zi){
System.out.println("f1是Zi的類型");
}
else{
System.out.println("f1是Son的類型");
}
多态的轉型:
多态的轉型分為向上轉型和向下轉型兩種。
向上轉型:多态本身就是向上轉型的過程
使用格式:父類類型 變量名=new 子類類型();
使用場景:當不需要面對子類類型時,通過提高擴張性,或者使用父類的功能就能完成相應的操作。
向下轉型:一個已經向上轉型的對象可以使用強制類型轉換的格式,将父類類型轉為子類引用類型
轉為子類引用各類型
使用格式:子類類型: 子類類型 變量名=(子類類型)父類類型的變量;
使用場景:當要使用子類的特有功能時。
package day0524;
public class demo04 {
public static void main(String[] args) {
People p=new Stu();
p.eat();
//調用特有的方法
Stu s=(Stu)p;
s.study();
//((Stu) p).study();
}
}
class People{
public void eat(){
System.out.println("吃飯");
}
}
class Stu extends People{
@Override
public void eat(){
System.out.println("吃水煮肉片");
}
public void study(){
System.out.println("好好學習");
}
}
class Teachers extends People{
@Override
public void eat(){
System.out.println("吃櫻桃");
}
public void teach(){
System.out.println("認真授課");
}
}
package qingfeng;
public class demo1 {
public static void main(String[] args) {
A a=new A();
a.show();
B b=new B();
b.show();
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("A");
}
}
class B extends A{
public void show2(){
System.out.println("B");
}
}
class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("C");
}
}
輸出結果A B