A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

wAng_Yi

初级黑马

  • 黑马币:41

  • 帖子:11

  • 精华:0

© wAng_Yi 初级黑马   /  2018-8-29 16:25  /  627 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wAng_Yi 于 2018-8-29 16:49 编辑

[Java] 纯文本查看 复制代码
 abstract class Animal {
    private int age;
    private String color;

    public int getAge() {
        return age;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Animal(int age, String color) {

        this.age = age;
        this.color = color;
    }

    public Animal() {

    }

    public abstract void eat(String something);

}

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

    public void catchMouse(){
        System.out.println("猫在抓老鼠!");
    }
}

 class Dog extends Animal {

    @Override
    public void eat(String something) {
        System.out.println("狗吃" + something + "!");
    }

    public void lookHome(){
        System.out.println("狗子在看家!");
    }
}

 class Person {
    private String name;
    private int age;
    
    public void keepPet(Animal animal,String something){
        System.out.print(getName() + "在喂");
        animal.eat(something);
    }


    public Person() {
    }

    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 Person(String name, int age) {

        this.name = name;
        this.age = age;
    }
}

public class Demo {

    public static void main(String[] args) {
        Person p1 = new Person("Jack",24);
        Cat cat = new Cat();
        Dog dog = new Dog();

        cat.eat("鱼");
        dog.eat("骨头");
        cat.catchMouse();
        dog.lookHome();

        p1.keepPet(cat,"猫粮");
        p1.keepPet(dog,"狗粮");
    }

}



以上面的例子为例,对Java中的多态进行说明
多态的概念:
同一个事物可以有多种不同的表示形态;
多态在Java中的体现:
父类型引用指向子类实例对象;(接口类型引用指向实现类对象);
比如例子中,Animal animal = new Dog();
多态的前提:多态中的两个类型,必须有继承关系(或者接口实现关系);
多态的好处:使用多态可以提高代码复用性,降低维护成本;提高程序扩展性,降低程序的耦合性;
例如,例子中的Person类的方法:
public void keepPet(Animal animal,String something){
System.out.print(getName() + "在喂");
animal.eat(something);
}
可以调用Dog类和Cat类的对象传参
多态的弊端:
父类型引用不能使用子类独有属性和功能;
多态弊端的解决:
使用强制向下转型,将父类型引用转换为子类型引用;
多态的类型转换:
将子类型引用赋值给父类型引用,是向上转型,因为父类型中的成员子类中都有,所以可以自动转换,叫做自动向上转型;
将父类型引用赋值给子类型引用,是向下转型,因为父类型中不一定具有子类型中的成员,所以需要强制转换,叫做强制向下转型;
强制向下转型容易遇到的问题:
如果将不是该类的对象强制转换为该类型,就会出现一个运行时异常:类型转换异常;
避免类型转换异常的解决办法:
在强制向下转型之前先使用关键字:instanceof 进行判断;
多态中成员的特点:
多态发生在父类型引用和子类对象之间,所以静态成员不参与多态,编译和运行都看父类;
非静态成员,编译期都看父类,运行期,函数看子类;


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马