java 面相,java学习17-面相对象(多态)
多態
——父類或者接口的引用指向自己的子類對象。
優點:提高代碼的擴展性
弊端:前期建立父類的引用,雖然可以接受后期所有該類的子類的對象。但是只能使用父類中的功能,不能使用子類特有的功能,因為前期的程序無法知道后期的子類的特有內容的。但是前期的程序可以使用子類覆蓋了父類的方法的內容。
前提:
1. 必須存在著繼承關系。
2. 通常使用覆蓋操作
例子:
package com.dragon.src;
/**
* 抽象類
* @author DRAGON
*
*/
abstract class Animal
{
abstract void eat();
}
class Dog extends Animal
{
@Override
void eat() {
System.out.println("小狗在吃飯");
}
public void Home(){
System.out.println("小狗在看門");
}
}
class Cat extends Animal{
@Override
void eat() {
System.out.println("小貓在吃魚");
}
public void catchMouse(){
System.out.println("小貓在捉老鼠");
}
}
class Pig extends Animal{
@Override
void eat() {
System.out.println("豬在吃飼料");
}
public void gongDi() {
System.out.println("豬拱地");
}
}
public class DuotaiDemo {
/**
* @param args
*/
public static void main(String[] args) {
Dog dog = new Dog();
//dog.eat();
Cat cat = new Cat();
//cat.eat();
Pig pig = new Pig();
//使用多態性,都屬于animal
eatmethod(dog);
eatmethod(cat);
eatmethod(pig);
/***********向上轉型*************/
//父類應用指向子類的對象
//animal引用可以指向任意的子類型的對象
//但animal引用只能調用Animal中的方法
Animal animal = new Dog();//
//好處:提高了擴展性
//局限:只能使用父類中的方法
//這種提升可以限制對子類對象的操作
/***********向上轉型*************/
Dog dog2 = (Dog)animal;//變成子類
//優點:可以使用子類的特有方法
//弊端:如果類型轉換錯誤,會出現運行異常
//應用情景:
//當需要對程序進行擴展,或者限定對對象的方法時,可以使用向上轉型,操作其父類型
//當要使用子類的特有的內容是,就需要向下轉型,轉型前一定要判斷,否則內容容易出現異常
//注意:在整個轉型過程中,自始至終都是一個子類對象在做類型的變化而已,千萬別把父類對象轉成子類型,這是不可能的
}
//共性功能
public static void eatmethod(Animal animal){
animal.eat();
}
//轉型判斷
public static void method(Animal animal) {
//向下轉型前的健壯性進行類型判斷
if(animal instanceof Cat){
Cat cat = (Cat)animal;
cat.catchMouse();
}else if(animal instanceof Dog){
Dog dog = (Dog)animal;
dog.Home();
}else if(animal instanceof Pig){
Pig pig = (Pig)animal;
pig.gongDi();
}
}
}
應用情景:
//當需要對程序進行擴展,或者限定對對象的方法時,可以使用向上轉型,操作其父類型
//當要使用子類的特有的內容是,就需要向下轉型,轉型前一定要判斷,否則內容容易出現異常
//注意:在整個轉型過程中,自始至終都是一個子類對象在做類型的變化而已,千萬別把父類對象轉成子類型,這是不可能的
原理:在同一塊堆內存塊中,不同的引用對方法產生了不同的作用。
多態的出現在成員調用上的特點:
1.成員變量
編譯時期:參考的是引用型變量所屬的類中是否有調用的成員變量,如果有,編譯通過,如果沒有編譯失敗。
運行時期:調用的也是引用型變量所屬類中的成員變量。
簡單說:編譯和運行都看等號的左邊。
2.成員函數。
編譯時期:參考的是引用型變量所屬的類中是否有調用的方法。有,編譯通過,沒有編譯失敗。
運行時期:參考的是對象所屬的類中是否有調用的方法,如果有運行子類自己的方法,如果沒有就父類的方法。
簡答說:編譯時期看左邊,運行時期看右邊。因為函數有一個覆蓋的特性。
非靜態方法需要和當期運行的對象進行動態綁定,哪個對象調用了這個方法,這個方法就所屬于哪個對象。就會運行哪個對象的中的方法。
3,靜態函數。
編譯時期:參考的是引用型變量所屬的類中是否該方法。
運行時期:參考的也是引用型變量所屬的類中的方法。
簡單說:編譯和運行都看左邊。
因為靜態方法是不所屬于對象的,是所屬于類的,
它會類加載的時候,靜態的綁定到所屬的類上。
總結
以上是生活随笔為你收集整理的java 面相,java学习17-面相对象(多态)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女子小肠比正常人长一倍多 医生:管住嘴迈
- 下一篇: 新西兰本地工厂制造 满电续航300公里: