海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020java教程:面向对象三大特性之多态

未分类
2020-08-11 06:51:13
1822677238@qq.com

手机扫码查看

2020java教程:面向对象三大特性之多态

面向对象三大特性之多态

生活中的人物视角
生活中,不同人物角色看待同一个对象的视角不同,关注点也不同

比如学生小明
在父母眼里他是儿子,在爷爷眼里他是孙子
在老师眼里他是学生,在同学眼里他是同学

生活中的多态
如果你看见 蜥蜴 你会说 它是什么?
蜥蜴?动物?爬虫?
生活中的多态是指`客观事物在人脑中的主观反应`
主观意识上的类别与客观存在的对象具有 “is a” 关系时,即形成多态

程序中的多态
概念:父类引用指向子类对象,从而产生多种形态
父类对象(引用类型)Animal a=new Dog();子类对象(对象类型)
二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。

多态中的方法覆盖
如果子类中覆盖了父类中的方法,以父类型引用调用此方法时,优先执行父类还是子类中的方法?
实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法。

向上转型以及向下转型

public class demos{
    public static void main(String[] args) {
        //父类引用中保存真实子类对象称为向上转型(装箱)
        Animal a=new Dog();
        a.feed();
        //a.run();ERROR,父类没有定义run方法,无法调用
        //向下转型,转回自身类型
        Dog d=(Dog)a;
        d.feed();
        d.run();
    }
}
class Animal{
    public void feed(){
        System.out.println("Animal feed方法");
    }
}
class Dog extends Animal{
    public void feed() {
        System.out.println("Dog的 feed方法");
    }
    public void run(){
        System.out.println("Dog的 run方法");
    }
}

instanceof关键字

public class demos{
    public static void main(String[] args) {
        Animal a=new Dog();
        //向下转型前,应判断引用中的对象真实类型
        // 保证类型转换的正确性
        //关键字 instanceof
        //语法  引用 instanceof  类型
        if(a instanceof Cat){
            Cat c=(Cat)a;
            c.feed();
        }else if(a instanceof Dog){
            Dog d=(Dog)a;
            d.feed();
        }
    }
}
class Animal{
    public void feed(){
        System.out.println("Animal feed方法");
    }
}
class Dog extends Animal{
    public void feed() {
        System.out.println("Dog的 feed方法");
    }
}
class Cat extends Animal{
    public void feed(){
        System.out.println("Cat的 feed方法");
    }
}

总结

多态的两种应用场景:
1.使用父类作为方法形参 ,实现多态
1.1调用方法时,可传递的实参类型包括:本类型对象+ + 其所有的子类对象

2.使用父类作为方法返回值,实现多态
2.1调用方法后,可得到的结果类型包括:本类型对象+ + 其所有的子类对象

多态的作用:
屏蔽子类间的差异; 灵活、耦合度低

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注