• JAVA多态


    目录

    实现多态的条件

    多态的具体体现

    1) 方法的多态

    2) 对象的多态

    向上转型

     向下转型:

    JAVA的动态绑定机制

     多态的应用

     多态参数

    JAVA面向对象编程有三大特性:封装、继承、多态。

    多态就是不同对象对同一物体或事件发出不同的反应或响应。比如stuendt是一个父类,那么在操场上上体育课的学生和在教室里面的学生就是它的子类。这时上课铃声响了,上体育课的学生去操场,在教室里面上课的学生则是回教室,不同的学生有着不同的反应,这就是多态。

    实现多态的条件

    实现多态的条件:
    1.继承:必须要有子类继承父类的继承关系。
    2.重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
    3.向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
     

    多态的具体体现

    1) 方法的多态

    2) 对象的多态

    核心:
    1.一个对象的编译类型和运行类型可以不一致
    如:Animal animal=new Dog();
            animal=new Cat();
    Cat和Dog是Animal的子类
    2.编译类型在定义对象是就确定,不能改变
    3.运行类型可以改变
    4.编译类型看定义时=的左边,运行类型看右边
    5.对象能调用那些方法成员是由其编译类型决定的

    向上转型

    向上转型 : 父类的引用指向了子类的对象
    语法:父类类型引用名 = new 子类类型 ();
    Animal animal = new Cat();
    Object obj = new Cat();// 可以吗 ? 可以 Object 也是 Cat 的父类
    向上转型调用方法的规则如下 :
    (1) 可以调用父类中的所有成员 ( 需遵守访问权限 )
    (2) 但是不能调用子类的特有的成员
    (#) 因为在编译阶段,能调用哪些成员 , 是由编译类型来决定的
    animal.catchMouse(); 错误
    (4) 最终运行效果看子类 ( 运行类型 ) 的具体实现 , 即调用方法时,按照从子类 ( 运行类型 ) 开始查找方法
    ,然后调用,规则我前面我们讲的方法调用规则一致。

     向下转型

    (1) 语法:子类类型 引用名 = (子类类型)父类引用 ;
    问一个问题 ? cat 的编译类型 Cat, 运行类型是 Cat
    Cat cat = (Cat) animal;
    cat.catchMouse();// 猫抓老鼠
    (2) 要求父类的引用必须指向的是当前目标类型的对象

    JAVA的动态绑定机制

    1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型(也就是与运行类型)绑定(意思就是如:有一个Cat类,Cat类中有一个cay方法,这个方法会和Cat类发生动态绑定

    2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

    1. package com.hspedu.poly_.dynamic_;
    2. public class DynamicBinding {
    3. public static void main(String[] args) {
    4. //a 的编译类型 A, 运行类型 B
    5. A a = new B();//向上转型
    6. System.out.println(a.sum());//?40 -> 30
    7. System.out.println(a.sum1());//?30-> 20
    8. }
    9. }
    10. class A {//父类
    11. public int i = 10;
    12. //动态绑定机制:
    13. public int sum() {//父类 sum()
    14. return getI() + 10;//20 + 10
    15. }
    16. public int sum1() {//父类 sum1()
    17. return i + 10;//10 + 10
    18. }
    19. public int getI() {//父类 getI
    20. return i;
    21. }
    22. }
    23. class B extends A {//子类
    24. public int i = 20;
    25. // public int sum() {
    26. // return i + 20;
    27. // }
    28. public int getI() {//子类 getI()
    29. return i;
    30. }
    31. // public int sum1() {
    32. // return i + 10;
    33. // }
    34. }

     多态的应用

    数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
    现有一个继承结构如下:要求创建1个Person、2个Student对象和2个Teacher对象,统一放在数组中,并调用每个对象的say方法

     

    1. package com.java.poly_.polyarr;
    2. public class PolyArray {
    3. public static void main(String[] args) {
    4. Person[] persons=new Person[5];
    5. persons[0]=new Person("jack",20);
    6. persons[1]=new Student("jack",18,100);
    7. persons[2]=new Student("smith",19,99);
    8. persons[3]=new Teacher("scott",300,20000);
    9. persons[4]=new Teacher("king",50,25000);
    10. //循环遍历多态数组 编译类型是person
    11. for(int i=0;i
    12. System.out.println(persons[i].say()); //动态绑定机制
    13. }
    14. }
    15. }
    16. class Person {
    17. private String name;
    18. private int age;
    19. public Person(String name, int age) {
    20. this.name = name;
    21. this.age = age;
    22. }
    23. public String getName() {
    24. return name;
    25. }
    26. public void setName(String name) {
    27. this.name = name;
    28. }
    29. public int getAge() {
    30. return age;
    31. }
    32. public void setAge(int age) {
    33. this.age = age;
    34. }
    35. public String say(){
    36. return name+"\t"+age;
    37. }
    38. }
    39. class Student extends Person{
    40. private double sore;
    41. public Student(String name, int age, double sore) {
    42. super(name, age);
    43. this.sore = sore;
    44. }
    45. public double getSore() {
    46. return sore;
    47. }
    48. public void setSore(double sore) {
    49. this.sore = sore;
    50. }
    51. //重写
    52. @Override
    53. public String say() {
    54. return super.say()+"sore"+sore;
    55. }
    56. }
    57. class Teacher extends Person{
    58. private double salary;
    59. public Teacher(String name, int age, double salary) {
    60. super(name, age);
    61. this.salary = salary;
    62. }
    63. public double getSalary() {
    64. return salary;
    65. }
    66. public void setSalary(double salary) {
    67. this.salary = salary;
    68. }
    69. @Override
    70. public String say() {
    71. return super.say()+"salary="+salary;
    72. }
    73. }

    调用子类中的方法 

    1. package com.java.poly_.polyarr;
    2. public class PolyArray {
    3. public static void main(String[] args) {
    4. Person[] persons=new Person[5];
    5. persons[0]=new Person("jack",20);
    6. persons[1]=new Student("jack",18,100);
    7. persons[2]=new Student("smith",19,99);
    8. persons[3]=new Teacher("scott",300,20000);
    9. persons[4]=new Teacher("king",50,25000);
    10. //循环遍历多态数组 编译类型是person
    11. for(int i=0;i
    12. System.out.println(persons[i].say()); //动态绑定机制
    13. if(persons[i] instanceof Student){
    14. Student student=(Student)persons[i];
    15. student.study();
    16. //也可以一步 ((Student)persons[i]).study();
    17. }else if(persons[i] instanceof Teacher){
    18. Teacher teacher=(Teacher)persons[i];
    19. teacher.teach();
    20. }else if(persons[i] instanceof Person){
    21. System.out.println("有误");
    22. }
    23. }
    24. }
    25. }

     多态参数

    要求:定义员工类Employee, 包含姓名和工资, 包含姓名和月工资,计算年工资getAnnual的方法。普通员工和经理继承了员工类,经理类多了奖金bonus属性和管理mange方法,普通员工多了work方法。普通员工和经理需要重写计算工资getAnnual方法。

     父类员工

    1. package com.hansp.poly.polypar;
    2. public class Employee {
    3. private String name;
    4. private int salary;
    5. public Employee(String name, int salary) {
    6. this.name = name;
    7. this.salary = salary;
    8. }
    9. public String getName() {
    10. return name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;
    14. }
    15. public int getSalary() {
    16. return salary;
    17. }
    18. public void setSalary(int salary) {
    19. this.salary = salary;
    20. }
    21. public int getAnnual(){
    22. return salary*12;
    23. }
    24. }

    子类经理

    1. package com.hansp.poly.polypar;
    2. public class manager extends Employee {
    3. private int bonus;
    4. public manager(String name, int salary, int bonus) {
    5. super(name, salary);
    6. this.bonus = bonus;
    7. }
    8. public void manage(){
    9. System.out.println("经理管事");
    10. }
    11. public int getBonus() {
    12. return bonus;
    13. }
    14. public void setBonus(int bonus) {
    15. this.bonus = bonus;
    16. }
    17. @Override
    18. public int getAnnual() {
    19. return super.getAnnual()+getBonus();
    20. }
    21. }

    子类员工

    1. package com.hansp.poly.polypar;
    2. public class staff extends Employee {
    3. public void work(){
    4. System.out.println("员工工作");
    5. }
    6. public staff(String name, int salary) {
    7. super(name, salary);
    8. }
    9. @Override
    10. public int getAnnual() {
    11. return super.getAnnual();
    12. }
    13. }

     测试类

    1. package com.hansp.poly.polypar;
    2. public class Demo {
    3. public static void main(String[] args) {
    4. manager a = new manager("小王", 8000, 2000);
    5. staff b = new staff("小袁", 5000);
    6. Demo c=new Demo();
    7. c.show(a);
    8. c.show(b);
    9. c.testWork(a);
    10. c.testWork(b);
    11. }
    12. public void show(Employee e)//展现员工的年工资
    13. {
    14. System.out.println(e.getAnnual());
    15. }
    16. public void testWork(Employee e){
    17. if(e instanceof manager)
    18. {
    19. manager a=(manager) e;
    20. a.manage();
    21. }
    22. if(e instanceof staff){
    23. staff a=(staff) e;
    24. a.work();
    25. }
    26. }
    27. }

     

     

  • 相关阅读:
    ES6 面试题
    java计算机毕业设计环巢湖区域旅游网站MyBatis+系统+LW文档+源码+调试部署
    MySQL数据库SSL连接测试
    Linux 进程控制
    autoware.ai感知随笔--地面滤波
    期货开户云流程和注意事项
    新消费降温,良品铺子还能走多远?
    java计算机毕业设计鲜花订购网微服务源码+系统+数据库+lw文档
    1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码
    从零开始学习c++全套通关系列(第一章)万字总结,建议收藏~
  • 原文地址:https://blog.csdn.net/qq_61466402/article/details/127599513