🌈Java从入门到入坟✨学习笔记✨(五)小白必备之面向对象-多态性详解

举报
Code皮皮虾 发表于 2021/08/18 19:09:05 2021/08/18
【摘要】 🌈Java从入门到入坟✨学习笔记✨(五)小白必备之面向对象-多态性详解

Code皮皮虾 一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm…,日子还很长,让我们一起加油努力叭🌈

欢迎各位小伙伴们关注我的公众号:JavaCodes,名称虽带Java但涉及范围可不止Java领域噢😁,期待您的关注❤


Java更新目录详情链接😁

🌈Java从入门到入坟⭐学习笔记⭐(一)String常用方法总结😊(小白必备知识点!!!)

🌈Java从入门到入坟⭐学习笔记⭐(二)final、static关键字总结😊(小白必备知识点!!!)

🌈Java从入门到入坟⭐学习笔记⭐(三)封装性及四种权限修饰符详解😊(小白必备知识点!)

🌈Java从入门到入坟⭐学习笔记⭐(四)小白必备之面向对象-继承的定义与使用

🌈Java从入门到入坟✨学习笔记✨(五)小白必备之面向对象-多态性详解


多态概述

什么是多态性?

对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用)

多态的使用

有了对象的多态性以后,我们再编译期,只能调用父类声明的方法,但在运行期,我们实际执行的是子类重写父类的方法;

总结:编译看左边,运行看右边

多态存在的三个必要条件

  1. 继承
  2. 重写
  3. 父类引用指向子类对象

多态的使用

多态定义格式:父类 变量名 = new 子类();

public class Main {

    public void fun(Person person) {
        person.study();
        person.sleep();
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.fun(new Student());

        System.out.println("---------");
        main.fun(new Teacher());
    }

}


class Person{

    public void study(){
        System.out.println("学习");
    }

    public void sleep(){
        System.out.println("睡觉");
    }
}

class Student extends Person{

    public void study(){
        System.out.println("学生学习");
    }

    public void sleep(){
        System.out.println("学生睡觉");
    }
}


class Teacher extends Person{
    public void study(){
        System.out.println("老师学习");
    }

    public void sleep(){
        System.out.println("老师睡觉");
    }
}

在这里插入图片描述


多态不适用情况

我们在Person、Studen、Teacher中都定义id值

public class Main {

    public void fun(Person person) {
        person.study();
        person.sleep();
    }

    public static void main(String[] args) {
        Person student = new Student();
        System.out.println(student.id);

        Person teacher = new Teacher();
        System.out.println(teacher.id);
    }

}


class Person{
    int id = 200;
}

class Student extends Person{
    int id = 50;
}


class Teacher extends Person{
    int id = 100;
}

在这里插入图片描述

==结论==:多态只适用于方法,不适用于属性(==编译和运行都看左边==)


instanceof关键字的使用

a instanceof A :判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。

public static void main(String[] args) {
        Person student = new Student();

        Person teacher = new Teacher();

        System.out.println(student instanceof Person);
        System.out.println(teacher instanceof Person);

        System.out.println(student instanceof Teacher);
    }

在这里插入图片描述

使用强转

System.out.println((Teacher)student instanceof Teacher);

在这里插入图片描述

结论:为了避免在向下转型时出现==ClassCastException==异常,我们在向下转型之前,先进行==instance==的判断,一旦返回==true==,就进行向下转型。如果返回==false==,就不进行向下转型。

还有在==instanceof==多重继承的情况下也是成立的
例:a继承A,A又继承B,这为多重继承,所以==a instanceof A返回为true,a instanceof B返回也是true==


多态转型

在这里插入图片描述

==向上转型==

  • 当子类对象赋值给一个父类引用时,即向上转型(多态本身就是向上转型的过程)
  • 格式:父类类型 变量名 = new 子类类型();

==向下转型==

  • 通过强制类型转换格式,将父类引用转为子类格式
  • 格式:子类类型 变量名 = (子类类型)父类类型的变量;
public class Main {


    public static void main(String[] args) {
        Person person = new Student();

        Student student = new Student(); //向上转型
        Student student1 = (Student)person; //向下转型

        student.sleep();
        student1.sleep();
    }

}


class Person{
    public void sleep() {
        System.out.println("睡觉");
    }
}

class Student extends Person{
    public void sleep() {
        System.out.println("学生睡觉");
    }
}

在这里插入图片描述

==向下转型注意事项(注意)==

  • 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)

  • 向下转型只能转型为本类对象。


多态的优缺点

优点

缺点

  1. 无法使用子类特有的功能(如要使用就要使用向下转型强制类型转换)




最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以==一键三连哦!==,感谢支持,我们下次再见~~~


一键三连.png

  1. 提高了代码的维护性(由继承保证)
  2. 提高代码复用性(由继承保证)
  3. 提高了代码的扩展性:新增加的子类不影响已存在类的多态性、继承性以及其他特性
  4. 安全性:向上转型将子类类型隐藏了起来
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。