ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Java基础】面向对象的特征:多态性

2022-09-14 19:33:13  阅读:244  来源: 互联网

标签:Java Chinese 面向对象 多态性 多态 public Person American eat


目录

1.简单说明

同一种事物表现出的多种形态,比如打印,都执行打印操作,但会得到彩色或黑白
image

(1)对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。

(2)比如有一个函数是叫某个人来吃饭,函数要求传递的参数是人的对象,可是来了一个美国人,你看到的可能是用刀和叉子在吃饭,而来了一个中国人你看到的可能是用筷子在吃饭,这就体现出了同样是一个方法,可以却产生了不同的形态,这就是多态!

2.举例说明

下面有三个类,American类和Chinese类都继承Person类并重写了eat()方法
Person类

public class Person {
    public void eat() {
        System.out.println("人吃饭");
    }
}

American类

public class American extends Person {
    public void eat() {
        System.out.println("美国人用刀叉吃饭");
    }
}

Chinese类

public class Chinese extends Person{
    public void eat(){
        System.out.println("中国人用筷子吃饭");
    }
}

多态体现1
父类引用指向子类对象,Person类型对象调用eat方法,发现执行的是子类中的方法

        Person a1 = new American();
        a1.eat();    //美国人用刀叉吃饭

        Person a2 = new Chinese();
        a2.eat();    //中国人用筷子吃饭

多态体现2
我们有一个叫人吃饭的方法,形参为Person类型(相当于形参为抽象的,如果写为American或Chinese则方法不能通用)

    public void CallToEat(Person person){
        person.eat();
    }

给这个方法传入American或Chinese类型的对象(形参为Person类型),执行的是子类中的方法,执行同样的方法得到不一样的结果

    public static void main(String[] args) {
        Test test = new Test();
        American american = new American();
        Chinese chinese = new Chinese();

        test.CallToEat(american);    //美国人用刀叉吃饭
        test.CallToEat(chinese);    //中国人用筷子吃饭
    }

3.属性有没有多态呢

(1)我们给Person类和American类中加入name属性,并赋初始值。

    String name = "人的姓名";
    String name = "美国人姓名";

执行以下语句,输出为父类中的属性值,因此属性是没有多态的(想调用子类的属性或子类特有的方法使用向下转型)

        Person a1 = new American();
        System.out.println(a1.name);    //人的姓名

(2)如果去掉Person类中的name属性呢,编译错误
image

4.总结

  • 多态使用的前提

    • 类的继承
    • 方法重写
  • 编译看左边,运行看右边Person a1 = new American();

    • 编译时,变量a1为Person类型,只能调用Person类中eat()方法,但在运行时实际执行的是子类重写父类的方法。
    • 如果父类中没有该方法,则编译错误
  • 虚函数(虚拟方法、虚拟函数)

    • Java中其实没有虚函数的概念,有的人也将Person类中的eat()函数称为虚函数,即编译期无法确定的方法

参考:
(1)多态的概念和作用(深入理解)
(2)菜鸟教程:Java多态

标签:Java,Chinese,面向对象,多态性,多态,public,Person,American,eat
来源: https://www.cnblogs.com/zhishu/p/16690773.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有