多态

概述:Polymorphismm同一个方法调用,由于对象不同会有不同的行为。

多态条件:重写、继承、引用(父类引用子类对象)。

父类引用指向子类对象并该父类引用调用子类重写的方法,此时就出现多态。

引用变量的两种类型

  • 编译时类型:由声明类型决定,一般是父类。

  • 运行时类型:由实际对应的类型决定,一般是子类。

比如:

AnimalPoly ap1 = new BirdPoly();

AnimalPoly是编译时类型,BirdPoly是运行时类型。

多态的好处:我们不用针对每一个具体对象都去写相应的方法,直接通过父类对象辨别具体对象去引用,找到重载的方法输出即可。

示例:

package com.itcode.demo;  

/**      
 * @author: 成都码到功成学员  
 * @description:  
 * 多态 
 * 多态条件:重写、继承、引用(父类引用子类对象) 
 */  
class AnimalPoly{  

    public void shout() {  
        System.out.println("动物叫");  
    }  
}  

// 多态条件:继承  
class CatPoly extends AnimalPoly{  

    // 多态条件:重写  
    public void shout() {  
        System.out.println("喵喵");  
    }  
}  

class DogPoly extends AnimalPoly{  

    // 多态条件:重写  
    public void shout() {  
        System.out.println("汪汪");  
    }  
}  

class BirdPoly extends AnimalPoly{  

    // 多态条件:重写  
    public void shout() {  
        System.out.println("啾啾");  
    }  
}  


public class TestPoly {  

    public static void main(String[] args) {  
        DogPoly dp = new DogPoly();  
        // 多态条件:引用(父类引用子类对象)  
        animalShout(dp); // 汪汪  
        CatPoly cp = new CatPoly();  
        animalShout(cp);// 喵喵   
        BirdPoly bp = new BirdPoly();  
        animalShout(bp);// 啾啾  
        AnimalPoly ap = new AnimalPoly();  
        animalShout(ap);// 动物叫  

        // 当然也可以这样调用,效果也类似。  
        AnimalPoly ap1 = new BirdPoly();  
        animalShout(ap1);// 啾啾  
    }  

    // 父类引用指向子类对象并该父类引用调用子类重写的方法,此时就出现多态。  
    static void animalShout(AnimalPoly a) {  
        a.shout();  
    }  
}

示例2:关于多态运行分析

对象转型

向上转型:编译类型>声明类型,小转大,自动转。 编译看左,运行看右。

如:Animal a = new Cat();

向下转型:编译类型<声明类型,大转小,强转。可以使用子类特有方法。编译看左,运行看右。

比如:Cat c = (Cat)new Animal;

或者

示例

final

修饰变量:值不能被修改。

修饰方法:不能被重写,但可以重载。

修饰类:不能被继承。

Last updated

Was this helpful?