1. 程式人生 > >多型的基本知識

多型的基本知識

多型:
1.何為多型
2.多型的前提條件;
3.多型訪問成員的特點
4.多型的優點
5多型的缺點
6如何解決多型的缺點了?
一、多型
某個事物,在不同的時刻表現出來的不同狀態
比如: 貓是動物
Animer c = new Cat();
貓是貓
Cat c1 = new Cat();<記得從右邊往左邊開始年>
二、前提條件
A:有繼承的關係
B:子類重寫父類的方法
C:父類的引用(比如說上面的c )指向子類的物件
舉個例子來說明一下:
/*
動物、狗的例子:
*/
class Animer{
public void show(){
System.out.println("父類的方法");
}
}


class Dog extends{//狗狗繼承動物
public void show(){
System.out.println("子類重寫了父類的方法");
}
}


class Test{
public static void main(String [] agrs){
//父類的引用指向子類的物件
Animer d = new Dog();
d.show();
}
}
三、多型訪問成員的特點:
在上面的例子中如果子類有特有的方法,在編譯的時候是否會報錯了?
class Animer{
public void show(){
System.out.println("父類的方法");
}
}


class Dog extends{//狗狗繼承動物
public void show(){
System.out.println("子類重寫了父類的方法");
}

public void methed(){
System.out.println("子類特有的功能");
}
}


class Test{
public static void main(String [] agrs){
//父類的引用指向子類的物件
Animer d = new Dog();
d.show();

d.methed();//這裡會提示報錯有!!!!
}
}
這個和多型訪問成員的特點有關,
那麼
多型有哪些特點了?
1.訪問成員變數的時候:
編譯看左邊,執行看左邊
2.構造方法
在繼承關係中,在呼叫子類的構造方法時候,系統都回去預設的訪問父類的無參構造方法
對父類的資料進行初始化
3.成員方法
編譯看左邊,執行看右邊

所聞的左邊就是父類,右邊就是子類


比如說訪問成員方法:
編譯看左邊就是說編譯的時候看這個方法在父類中是否存在,
執行看右邊是說呼叫的時候要看子類中的這個方法


四、.優點:可維護、可擴充套件型
可擴充套件型舉例說明:
class Animer{
public void eat(){
System.out.println("Animer eat");
}

public void sleep(){
System.out.println("Animer sleep");
}
}


class Cat extends Animer{
public void eat(){
System.out.println("Cat eat");
}

public void sleep(){
System.out.println("Cat sleep");
}
}


class Dog extends Animer{
public void eat(){
System.out.println("Dog eat");
}

public void sleep(){
System.out.println("Dog sleep");
}
}
//動物的工具類
class UserTool{
private UserTool(){}//這樣設計是為了防止new 物件

public static void useTool(Animer a){
a.eat();
a.sleep();
}


}


class Test3{
public static void main(String[] args){
Animer c = new Cat();//多型這樣來解釋:cat 是 animeir   從右邊往左邊看
Animer c2 = new Cat();
Animer c3 = new Cat();

//工具類中的方法是靜態方法,呼叫可以通過類名呼叫
//為了防止對工具類進行建立物件
//所以構造方法的修飾符該為private,這樣都不能建立物件了
//不信你可以試一下看報錯不?
/*
錯誤: UserTool()可以在UserTool中訪問private
UserTool ut = new UserTool();
*/
//UserTool ut = new UserTool();
UserTool.useTool(c);//傳遞的引數是引用型別,那麼要傳入一個物件
UserTool.useTool(c2);
UserTool.useTool(c3);
System.out.println("-------------------------");
// cat建立完了。這個時候如果要加入dog了
//這個時候只要建立dog類,然後繼承animer,在重寫父類的方法都可以了
//從而體現了多型的擴充套件型
Animer d = new Dog();
UserTool.useTool(d);

//後面如果還要新增,比如說Pig  ,只需要建立Pig類,然後在繼承Animer
//在main方法中在建立Pig物件,在呼叫工具類中的方法即可

五、缺點是:不能訪問子類特有的功能
六、怎麼辦了?
能否把父類的引用賦給子類的引用了?
可以
這個叫做向下轉型,注意的是需要強制轉換了


比如說:
Animer d = new Dog();//向上轉型
d.show();


Dog d2 = (Dog)d;//向下轉型
d2.methed();