Java多态

一、引例

class 动物
{}

classextends 动物
{}

classextends 动物
{}

猫 x = new 猫();

动物 x = new 猫();//一个对象,两种形态。

猫这类事物即具备者猫的形态,又具备着动物的形态,这就是对象的多态性。简单说:就是一个对象对应着不同类型。

二、继承让类之间产生关系,给多态提供了前提。

多态的前提:
1,必须有关系,继承,实现。
2,要有覆盖。

多态在代码中的体现:父类或者接口的引用指向其子类的对象。

多态的好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容。

多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。

***三、转型

向上转型和向下转型

例:

abstract class Animal
{
    abstract void eat();

}

class Dog extends Animal
{
    void eat()
    {
        System.out.println("啃骨头");
    }
    void lookHome()
    {
        System.out.println("看家");
    }
}

class Cat extends Animal
{
    void eat()
    {
        System.out.println("吃鱼");
    }
    void catchMouse()
    {
        System.out.println("抓老鼠");
    }
}

class Pig extends Animal
{
    void eat()
    {
        System.out.println("饲料");
    }
    void gongDi()
    {
        System.out.println("拱地");
    }
}


class DuoTaiDemo 
{
    public static void main(String[] args) 
    {
        
        Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是无法访问猫的特有功能。
                              //作用就是限制对特有功能的访问。
                              //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。目的是:1.提高扩展性 2.限制子类的特有功能
//        a.eat();        //可以调用
//        a.catchMouse(); //不能调用后期子类的特有内容
                              //如果还想用具体动物猫的特有功能。 
                              //你可以将该对象进行向下转型。
//        Cat c = (Cat)a;     //***向下转型的目的是为了使用子类中的特有方法。*** c.catchmouth()
//        c.eat();
//        c.catchMouse();

//        注意:对于转型,自始自终都是子类对象在做着类型的变化。
//        Animal a1 = new Dog();
//        Cat c1 = (Cat)a1;//ClassCastException 类型转换异常,不能把狗转成猫。


        /*
          Cat c = new Cat();

//        Dog d = new Dog();
//        多种调用方式
//        c.eat();
          method(c);
//        method(d);
method(new Dog());
*/ } public static void method(Animal a)//Animal a = new Dog(); { a.eat(); if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断 //通常在向下转型前用于健壮性的判断。 { Cat c = (Cat)a; c.catchMouse(); } else if(a instanceof Dog) { Dog d = (Dog)a; d.lookHome(); } else { } } /*麻烦 public static void method(Cat c) { c.eat(); } public static void method(Dog d) { d.eat(); } */ }
原文地址:https://www.cnblogs.com/kkkky/p/6395584.html