1. 程式人生 > >多型的瞭解及應用

多型的瞭解及應用

1.1多型的概述
多型是面向物件的三大特徵(封裝 繼承 多型)之一.
通俗理解:多型就是一種事物的多種形態,例如學生是人的一種,則一個具體的同學張三既是學生又是人,即出現了兩種形態.
專業的術語說就是:同一個實現介面,使用不同的例項而執行不同的操作。
1.2多型的定義和使用格式
定義格式:父類的引用變數指向子類物件
父類型別 變數名 = new 子類型別();
變數名.方法名();
普通類多型的定義的格式:

class Fu{}
class Zi extends Fu{ }	
Fu fu = new Zi();   
抽象類多型的定義的格式:
abstract class Fu{	
public abstract void method();
}
class Zi extends Fu{
	@Override
        public void method() {	}
}
Fu fu = new Zi();
介面類多型的定義的格式:
interface Fu{
	public abstract void method();
}
class Zi implements Fu{
	@Override
	public void method() {
		System.out.println("重寫介面的方法");
	}
}
Fu fu = new Zi();
注:當同一個父類的方法被不同子類重寫,在呼叫方法的時候,呼叫的為各個子類重寫後的方法:
Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //呼叫的是Student類重寫後的work方法
p2.work();	//呼叫的是Teacher類重寫後的work方法

1.3多型的成員變數和成員方法
1.3.1成員變數

//父類
class Fu{
	int num = 10;
}
//子類
class Zi extends Fu{
	int num = 15;
}
//多型成員變數
//第一種:父類和子類中都有同名的變數----結果是:10 結果是:15
//第二種:父類沒有的情況---編譯未通過
//第三種:子類沒有的情況---結果是:10 結果是:10
public class Demo {
	public static void main(String[] args) {
		//多型的表現 父類的引用指向子類物件
		Fu f= new Zi();
		System.out.println("結果是:"+f.num);
		Zi z = new Zi();
		System.out.println("結果是:"+z.num);
	}
/*
 * 結論:當子父類中出現相同的成員變數時,多型呼叫該變數的時:
 *    編譯時期:參考的是引用型別變數所屬的類中是否有被呼叫的成員變數----如果沒有,則編譯失敗
 *    執行時期:參考的是子類中的變數
 * 簡單可記做:編譯看左邊,執行看右邊
 */			
}

1.3.2成員方法

//父類
class Fu{
	void show(){
		System.out.println("執行結果:父類");
	}
}
//子類
class Zi extends Fu{
	void show() {
		System.out.println("執行結果:子類");
	}
}
//多型-----成員方法
//第一種:父類和子類中都有同名的方法----執行結果:子類
//第二種:父類沒有的情況---編譯時報錯
//第三種:子類沒有的情況---執行結果:父類
public class Demo {
	public static void main(String[] args) {
		//多型的表現 父類的引用指向子類物件
		Fu f= new Zi();
			f.show();
	}
/*
 * 結論:當子父類中出現相同的成員方法時,多型呼叫該變數的時:
 *    編譯時期:參考的是引用型別變數所屬的類中是否有被呼叫的成員變數----如果沒有,則編譯失敗
 *    執行時期:參考引用物件所指的物件所屬的類,並執行物件所屬類中多的成員方法;
 * 簡單可記做:編譯看左邊,執行看右邊
 */			
}

1.4instanceof關鍵字
     instanceof關鍵字的作用: 可以用來判斷某個物件是否屬於某種資料型別;
        格式:Boolean flag = 物件 instanceof 資料型別

class Person{};//人類
class Teacher extends Person{};//老師類
class Student extends Person{};//學生類
public class Demo4 {
	public static void main(String[] args) {
		Person p1 = new Student();
		boolean flag1 = p1 instanceof Student; //true
		boolean flag2 = p1 instanceof Teacher; //false
		boolean flag3 = p1 instanceof Person; //true
		System.out.println(flag1+":"+flag2+":"+flag3);
	}
}

1.5多型的轉型--向上轉型和向下轉型
        多型的轉型分為兩種:
                    向上轉型:當有子類物件賦值給一個父類引用時,便是向上轉型,多型本身就是向上轉型的過程.
                    使用格式:父類型別 變數名 = new 子類型別(); 如 Person p = new Student();
                    向下轉型:一個已經向上轉型的子類物件可以使用強制型別轉換的格式,將父類引用轉換為子類引用,
                    使用格式:子類型別變數名 = (子類型別)父類型別的變數;如 Student stu = (Student)p;
            注意:如果是直接創父類物件,則是無法向下轉型的;