多态的概述、成员访问特点、好处弊端及多态的转型

99 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情​ ​

目录

一、多态的概述

二、多态中的成员访问特点

三、多态的好处和弊端

四、多态的转型

五、多态的案例


一、多态的概述

什么是多态:

同一个对象,在不同时刻表现出来的不同形态

多态的前提:

要有继承或实现关系

要有方法的重写

要有父类引用指向子类对象

二、多态中的成员访问特点

成员访问特点:

成员变量

        编译看父类,运行看父类

成员方法

        编译看父类,运行看子类

代码演示:

动物类

public class Animal { 
    public int age = 40; 

        public void eat() { 
            System.out.println("动物吃东西"); 
    } 
}

猪类

public class Cat extends Animal { 
    public int age = 20; 
    public int weight = 10; 

    @Override 
    public void eat() { 
        System.out.println("猫吃鱼"); 
    }

    public void playGame() { 
        System.out.println("猫捉迷藏"); 
    } 
}

测试类

public class AnimalDemo { 
    public static void main(String[] args) { 
        //有父类引用指向子类对象 
        Animal a = new Cat(); 

        System.out.println(a.age// System.out.println(a.weight); 

        a.eat(); 
        // a.playGame(); 
    } 
}

三、多态的好处和弊端

好处:

提高程序的扩展性,定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

弊端:

不能使用子类的特有成员

四、多态的转型

向上转型:

父类引用指向子类对象就是向上转型

向下转型:

格式:子类型 对象名 = (子类型) 父类引用;

代码演示:

动物类

public class Animal { 
    public void eat() { 
        System.out.println("动物吃东西"); 
    } 
}

猫类

public class Cat extends Animal {
    @Override 
    public void eat() { 
        System.out.println("猫吃鱼"); 
    }

    public void playGame() { 
        System.out.println("猫捉迷藏"); 
    } 
}

测试类:

public class AnimalDemo { 
    public static void main(String[] args) { 
        //多态 
        //向上转型 
        Animal a = new Cat(); 
        a.eat(); 
        // a.playGame(); 

        //向下转型 
        Cat c = (Cat)a; 
        c.eat(); 
        c.playGame(); 
    } 
}

五、多态的案例

需求:请采用多态的思维实现猫和狗的案例,并在测试类中进行测试

代码实现:

动物类

public class Animal { 
    private String name; 
    private int age; 

    public Animal() { 
    }

    public Animal(String name, int age) { 
        this.name = name; 
        this.age = age; 
    }

    public String getName() { 
        return name; 
    }

    public void setName(String name) { 
        this.name = name; 
    }

    public int getAge() { 
        return age; 
    }

    public void setAge(int age) { 
        this.age = age; 
    }

    public void eat() { 
        System.out.println("动物吃东西"); 
    } 
}

猪类

public class Cat extends Animal { 

    public Cat() { 
    }

    public Cat(String name, int age) { 
        super(name, age); 
    }

    @Override 
    public void eat() { 
        System.out.println("猫吃鱼"); 
    } 
}

狗类

public class Dog extends Animal { 

    public Dog() { 
    }

    public Dog(String name, int age) { 
        super(name, age); 
    }

    @Override 
    public void eat() { 
        System.out.println("狗吃骨头"); 
    } 
}

测试类

public class AnimalDemo { 
    public static void main(String[] args) { 
        //创建猫类对象进行测试 
        Animal a = new Cat(); 
        a.setName("加菲"a.setAge(5System.out.println(a.getName() + "," + a.getAge()); 
        a.eat(); 

        a = new Cat("加菲", 5System.out.println(a.getName() + "," + a.getAge()); 
        a.eat(); 
    } 
}