一、多態
多態是同一個行爲具有多個不同表現形式或形態的能力。多態就是同一個接口,使用不同的實例而執行不同操作。
二、優點
1.消除類型之間的耦合關係
2.可替換性
3.可擴充性
4.接口性
5.靈活性
6.簡化性
三、條件
1.繼承(或實現接口)
2.重寫
3.父類引用指向子類對象
四、實例
例1:
//定義父類
public class Father {
//定義方法
public void fun(){
System.out.println("我是父類中的方法!");
}
}
//定義子類,繼承父類
class Son extends Father{
//重寫父類中的方法
@Override
public void fun() {
System.out.println("我是重寫後的方法!");
}
}
//測試類
class Test{
public static void main(String[] args){
//多態體現,父類引用指向子類對象
Father f = new Son();
//調用重寫後的方法
f.fun();
}
}
注意:
1.當使用多態方式(父類引用)調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。
2.當使用多態方式(父類引用)調用成員變量時,首先檢查父類中是否定義了該變量,如果沒有,編譯錯誤,如果有,使用父類定義的成員變量。
例2:
//定義父類
public class Father_2 {
//父類中的成員變量
int a = 10;
}
//定義子類,繼承父類
class Son_2 extends Father_2{
//子類中的成員變量
int a = 12;
}
//測試類
class Test_2{
public static void main(String[] args){
//多態體現
Father_2 f2 = new Son_2();
//調用成員變量,結果輸出的時父類中的成員變量
System.out.println(f2.a);
}
}
五、向上、向下轉型
向上轉型:
當有子類對象賦值給一個父類引用時,便是向上轉型,多態的本身其實就是向上轉型的過程。
向下轉型:
一個已經向上轉型的子類對象,使用強制類型轉換,將父類引用轉換爲子類引用,這個過程稱之爲向下轉型。(直接創建父類對象,無法向下轉型)
想要使用子類的成員變量或其特有的方法,需要使用到向下轉型。
例:
//定義父類
public class Father_3 {
//父類中的成員變量
int a = 10;
//定義方法
public void fun(){
System.out.println("我是父類中的方法!");
}
}
//定義子類,繼承父類
class Son_3 extends Father_3{
//子類中的成員變量
int a = 12;
//重寫父類中的方法
@Override
public void fun() {
System.out.println("我是重寫後的方法!");
}
//子類特有的方法
public void fun_2(){
System.out.println("我是子類特有的方法!");
}
}
//測試類
class Test_3{
public static void main(String[] args){
//多態體現,此過程爲向上轉型
Father_3 f3 = new Son_3();
//向下轉型,強制轉換
Son_3 s3 = (Son_3)f3;
//調用子類特有的成員
s3.fun_2();
System.out.println(s3.a);
}
}
六、instanceof運算符
instanceof是一個比較運算符,它用來判斷一個引用類型是否屬於某個類型(要有繼承和實現關係)的對象。
例:
//定義“人”類
public class Person {
public void eat(){
System.out.println("人都要吃飯!");
}
}
//定義“我” 類,繼承“人”類
class My extends Person{
public void eat(){
System.out.println("我是人,我也要吃飯!");
}
}
//定義測試類
class Test_4{
public static void main(String[] args) {
//多態體現
Person p = new My();
//判斷p 是否屬於Person類型
if (p instanceof Person) {
System.out.println(true);
}
//判斷p 是否屬於 My 類型
if (p instanceof My) {
System.out.println(true);
}
}
}