Java多态的理解

目录

一、什么是多态

二、多态实现的条件

三、实例分析

四、多态应用之一(多态数组)

五、多态参数


一、什么是多态

在Java中,多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性是指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。

二、多态实现的条件

1.继承关系

存在继承关系的类之间才能够使用多态性。多态性通常通过一个父类的引用指向子类的对象。

2.方法重写

子类必须重写(override)父类的方法。通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为。

3.父类引用指向子类对象

使用父类的引用变量来引用子类对象。这样可以实现对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定。

三、实例分析

public class JiCheng {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();
    }
}

class Animal {

    void eat() {
        System.out.println("动物捕食");
    }
}

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

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("小狗吃骨头");
    }
}

首先要明白,多态是针对方法的来说的

我们看,Cat类和Dog类继承自Animal类,并重写了eat方法。常说的“编译看左边,运行看右边”是说,animal作为父类的引用,它能调用的方法在编译时就已经确定了,它作为父类的引用,父类的所有方法,都可调用。运行看右边,是指,运行时,具体的方法,是看到底animal是什么类型的对象,上例可知,animal本质是Cat类的对象,所以实际效果是调用Cat类的方法。如果说,Cat类没有重写父类方法,则向上调用父类的方法。

这里涉及到Java的动态绑定,父类对象的引用绑定子类方法

对于子类中一些特有的方法,我们要让他回归本源,也就是强制转换为Cat,回归自我,右边类型是Cat类,左边也是Cat类引用接收,这里注意:我们只能强转父类的引用,不能强转父类对象,还有,不能强转为Dog,因为它本质是Cat类。

如果是,调用属性:则父类引用调用的是父类的属性,属性没有多态一说;

public class JiCheng {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();
        Cat cat = (Cat) animal;
        cat.jiao();
    }
}

class Animal {

    void eat() {
        System.out.println("动物捕食");
    }
}

class Cat extends Animal {
    void jiao() {
        System.out.println("miaomiaomiao~");
    }

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

四、多态应用之一(多态数组)

public class DuoTaiShuZu {
    public static void main(String[] args) {
        Person[] people = new Person[5];
        people[0] = new Person();
        people[1] = new Teacher();
        people[2] = new Student();
        for (int i = 0; i < 5; i++) {
            if (people[i] instanceof Person) {
                people[i].say();
            } else if (people[i] instanceof Student) {
                Student person = (Student) people[i];
                person.study();
            } else if (people[i] instanceof Teacher) {
                ((Teacher) people[i]).teach();
            }
        }
    }

}

class Person {
    String name;
    int age;

    void say() {
        System.out.println("人类可互相交流");
    }
}

class Teacher extends Person {
    @Override
    void say() {
        System.out.println("老师说要好好学习");
    }

    void teach() {
        System.out.println("老师教学生");
    }
}

class Student extends Person {
    @Override
    void say() {
        System.out.println("学生说要适当放松");
    }

    void study() {
        System.out.println("学生学知识");
    }
}

五、多态参数

方法定义形参为父类类型,实参允许为子类类型;

public class Test1 {
    public static void main(String[] args) {
        Test1 test1 = new Test1();
        Student student = new Student();
        Teacher teacher = new Teacher();
        test1.shitang(student);
        test1.shitang(teacher);
    }

    void shitang(Person a) {
        if (a instanceof Teacher) {
            ((Teacher) a).teach();
            return;
        }
        a.eat();
    }
}

class Person {
    void eat() {
        System.out.println("是个人就要吃饭");
    }
}

class Student extends Person {
    @Override
    public void eat() {
        System.out.println("学生在学生食堂吃饭");
    }

    void study() {
        System.out.println("学生上课");
    }
}

class Teacher extends Person {
    @Override
    public void eat() {
        System.out.println("老师在员工食堂吃饭");
    }

    void teach() {
        System.out.println("老师教书");
    }
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐晓率

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值