JavaSE(八)多态&抽象类

本文通过Java代码示例介绍了抽象类、多态的概念,展示了如何创建父类模板、子类继承以及向上和向下转型的应用,强调了面向对象设计中的开闭原则。

类:一组事物 相同的特征(有什么 属性成员变量)和行为(功能 方法)的抽象 类是一个模板

父类:一组子类 相同特征和行为的抽象 父类是子类的模板

多态

  • 多态的使用 是为了解决程序扩展问题

  • 多态概念:在运行过程 根据实际对象去调用其所对应的方法

  • 体现多态的条件:继承 重写 父类引用指向子类对象

1,多态基本使用

动物类

public class Animal {
    private int age;
    private String name;
​
    public Animal() {
    }
​
    public Animal(int age, String name) {
        this.age = age;
        this.name = name;
    }
​
    public void play() {
        System.out.println("动物在表演");
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

子类1

public class Monkey extends Animal {
    public Monkey() {
    }
​
    public Monkey(int age, String name) {
        super(age, name);
    }
​
    @Override
    public void play() {
        System.out.println("猴子表演骑单车");
    }
}
​

子类2

public class Elephant extends Animal {
    public Elephant() {
    }
​
    public Elephant(int age, String name) {
        super(age, name);
    }
​
    @Override
    public void play() {
        System.out.println("大象会表演喷水");
    }
}
​

马戏团

/**
 * 马戏团 Circus 有一批动物表演节目,提供表演功能 performance() 如果上台的是猴子 就让猴子表演他的技能
 * 猴子 表演骑单车  年龄 名称
 * 大象 表演喷水   年龄 名称
 * 狮子 表演跳火圈  年龄 名称
 * <p>
 * 程序扩展问题 功能新增
 * 老虎 表演吃人 年龄 名称
 * 1,新建一个Tiger类 继承Animal play重写
 * 2,改动Circus源码,
 * 七大设计原则:开闭原则 :对新增开放 对修改关闭
 */
//马戏团
public class Circus {
    public void performance(Animal animal) {
        //多态: 在运行过程 根据实际对象去调用其所对应的方法
        //多态体现的条件:继承 重写 父类引用指向子类对象
        animal.play();
    }
}
​

测试类

 /**
     * 多态的使用案例
     */
    private static void method1() {
        Circus circus = new Circus();
        Monkey monkey = new Monkey();
        Elephant elephant = new Elephant();
        Lion lion = new Lion();
        Animal tiger = new Tiger();
        //新语法: 父类引用 可以指向子类对象的;
        Animal animal = new Monkey();
        circus.performance(tiger);
//        circus.performance(tiger);
    }

2,向上转型

  • 父类引用 指向子类对象 (也称之为 向上转型)

  • 注意点:父类引用可以指向子类对象 但是父类引用不能调用子类中新增的成员

 /**
     * 注意点:父类引用可以指向子类对象 但是父类引用不能调用子类中新增的成员
     */
    private static void method2() {
        //父类引用 指向子类对象 (向上转型)
        Animal animal = new Monkey();
        Object obj = new Monkey();
        //父类引用可以指向子类对象 但是父类引用不能调用子类中新增的成员
//        obj.play();
        animal.play();
//        animal.jump();
    }

3,向上转型结合数组的使用

public static void method3() {
        Animal[] animals = new Animal[3];
        //不能调用null 的任何成员;一旦调用 会报空指针异常
        // System.out.println(animals.length);
        //向上转型
        /*Animal animal1 = new Monkey();
        animals[0] = animal1;*/
        animals[0] = new Monkey();
        animals[1] = new Elephant();
        animals[2] = new Lion();
        for (Animal a : animals) {
            a.play();
        }
        Object[] objects = new Object[3];
        objects[0] = new Monkey();
        objects[1] = new Elephant();
        objects[2] = new Tiger();
    }
private static void method4() {
        Animal[] animals = new Animal[3];
        animals[0] = new Monkey();
        animals[1] = new Elephant();
        animals[2] = new Lion();
​
        //取数组元素 向上转型
        Animal animal1 = animals[0];
        //实际对象对应的方法
        animal1.play();
    }

4,向下转型

/**
     * 向下转型
     */
    private static void method5() {
        //向上转型   float f = 10L;
        Animal animal = new Monkey();
        animal.play();

        //animal指向的对象是猴子类型的(或者是其子类型的对象)对象结果 为true ;否则为false
        if (animal instanceof Monkey) {
            //向下转型  int i = (int)10L;
            Monkey monkey = (Monkey) animal;
            monkey.jump();
        }
    }

抽象类

  • abstract关键字修饰类 表示这个类就是抽象类

    • 抽象类不能有对象 抽象类被设计出来就是用来被继承的;

  • abstract关键字修饰方法表示是抽象方法 抽象方法不能有方法体;

    • 抽象方法被设计出来就是用来被重写的

  • 注意点:一个包含抽象方法的类必须声明为抽象类;

//父类   只是作为 一组子类 模板
// 不应该有实例(对象) 被设计出来就是用来被继承的
//abstract关键字修饰类 表示这个类就是抽象类,抽象类不能有对象  抽象类被设计出来就是用来被继承的;
//注意点: 一个包含抽象方法的类必须声明为抽象类;
public abstract class Animal {
    private int age;
    private String name;

    public Animal() {
    }

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

    //抽象方法 不能有方法体;抽象方法被设计出来就是用来被重写的
    public abstract void play();

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值