java多态的理解(运行时多态),java多态的实现原理

  java多态的理解(运行时多态),java多态的实现原理

  00-1010 1.动态绑定机制的实例a实例b C2。多态数组3。多态数组4的高阶用法。多态参数5。多态参数的高阶用法

  

目录

java的动态绑定机制非常重要

 

  00-1010让我们看一个例子:

  阅读上面的代码,请解释下面的程序将输出什么结果:

  程序将输出40和30。这个例子很简单,看跑步类型就可以了。这段代码的运行类型是B,所以会调用B类的方法。

  00-1010让我们解决上述代码,并取消注册子类中的以下代码块:

  然后继承机制访问父类的sum方法:

  所以这里有个问题,这里的getI()会执行子类还是父类?

  当一个对象方法被调用时,它被绑定到对象的内存地址/运行类型。

  代码的运行类型还是B,所以这里会执行子类的getI()方法,结果输出是30。

  00-1010现在,我们来修改一下上面的代码。

  注销子类中的下列代码块:

  继承机制执行父类的sum1方法:

  所以这里有个问题,这里是I,会是子类还是超类?

  属性没有动态绑定机制,在哪里声明,在哪里使用(使用当前类)

  这里的I是在父类中声明的,所以父类的I属性会被选中,结果是20。

  00-1010定义:

  数组的定义类型是父类型,但实际保存的元素类型是子类类型。

  人员的父类别:

  /* * *多态数组父类*/public class person { privatestringname;私人年龄;public Person(String name,int age){ this . name=name;this.age=年龄;} public String getName(){ return name;} public void set name(String name){ this . name=name;} public int getAge(){ return age;} public void setAge(int age){ this . age=age;}公共字符串say(){ return name t age;} }学生子类:

  /* * *多态数组学生子类*/公有类学生扩展人{私有双倍分数;公学生(串名,int年龄,双分){ super(姓名,年龄);this.score=score}//覆盖父类的say方法公共字符串say(){ return super . say() t score;} }教师子类:

  /* * *多态数组教师子类*/公共类教师扩展person { private doublesal公师(字符串名,int age,double sal) { super(姓名,年龄);this.sal=sal} public double getSal(){ return sal;} public void setSal(double sal){ this . sal=sal;} public String say(){ return super . say() t sal;}}测试

  多态数组的使用:

  

public class Test { public static void main(String[] args) { // 多态数组的使用 Person[] persons = new Person[5]; persons[0] = new Person("dahe",20); persons[1] = new Student("wangwei",11,100); persons[2] = new Student("zhangsan",12,60); persons[3] = new Teacher("wang",33,15000); persons[4] = new Teacher("li",55,25000); // 循环遍历多态数组,调用say方法 for (int i = 0; i < persons.length; i++) { String out = persons[i].say(); // 动态绑定机制,编译类型永远都是Person // 运行类型是根据实际情况由JVM机决定 System.out.println(out); } }}

输出:

 

  

dahe 20wangwei 11 100.0zhangsan 12 60.0wang 33 15000.0li 55 25000.0

 

  

 

  

3.多态数组的高阶用法

现在,教师子类新增了教学方法:

 

  

public void teach() { System.out.println("老师:" + getName() + "正在讲课!");}

学生子类新增了学习方法:

 

  

public void study() { System.out.println("学生:" + getName() + "正在学习!");}

那么,有没有办法通过多态数组来访问他们子类对应的独有的方法呢?事实上,可以通过巧妙使用instanceof来解决:

 

  变通一下,改变多态数组的循环操作:

  

// 循环遍历多态数组,调用say方法for (int i = 0; i < persons.length; i++) { String out = persons[i].say(); // 动态绑定机制,编译类型永远都是Person // 运行类型是根据实际情况由JVM机决定 System.out.println(out); if (persons[i] instanceof Student) { // 向下转型 Student student = (Student) persons[i]; student.study(); } else if (persons[i] instanceof Teacher) { Teacher teacher = (Teacher) persons[i]; teacher.teach(); }}

输出:

 

  

dahe 20wangwei 11 100.0学生:wangwei正在学习!zhangsan 12 60.0学生:zhangsan正在学习!wang 33 15000.0老师:wang正在讲课!li 55 25000.0老师:li正在讲课!

 

  

大功告成!多态数组即强大又完美!

 

  

 

  

4.多态参数

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

 

  接下来我们来演示以下多态参数的使用:

  父类:

  

/** * 多态参数 - 父类 */public class Employee { private String name; private double sal; public Employee(String name, double sal) { this.name = name; this.sal = sal; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSal() { return sal; } public void setSal(double sal) { this.sal = sal; } // 得到年工资的方法 public double getAnnual() { return 12 * sal; }}

员工子类:

 

  

/** * 多态参数 - 子类员工 */public class Worker extends Employee{ public Worker(String name, double sal) { super(name, sal); } public void work() { System.out.println("普通员工:" + getName() + "正在工作!"); } public double getAnnual() { return super.getAnnual(); }}

经理子类:

 

  

/** * 多态参数 - 经理子类 */public class Manager extends Employee{ private double bonus; // 奖金 public Manager(String name, double sal, double bonus) { super(name, sal); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } public void manage() { System.out.println("经理:" + getName() + "正在管理!"); } @Override public double getAnnual() { return super.getAnnual() + bonus; }}

我们来测试一下,求不同岗位的雇员的年薪:

 

  

/** * 多态参数测试类 */public class Test { public static void main(String[] args) { Worker zhang = new Worker("张工",1000); Manager milan = new Manager("milan", 5000, 2000); Test test = new Test(); test.showEmpAnnual(zhang); test.showEmpAnnual(milan); } // 获取员工的年薪,采用多态参数 public void showEmpAnnual(Employee e) { System.out.println(e.getAnnual()); }}

输出:

 

  

12000.062000.0

 

  

 

  

5.多态参数的高阶用法

我们来对上面的多态参数代码做一个完善,如果传入的是员工,则调用自己的work方法,如果传入的是经理,则调用自己的manage方法

 

  增加一个下面的方法:

  

public void testWork(Employee e) { if (e instanceof Worker) { ((Worker) e).work(); // 向下转型 } else if (e instanceof Manager) { ((Manager) e).manage(); }}

测试:

 

  

test.testWork(zhang);test.testWork(milan);

输出:

 

  

普通员工:张工正在工作!经理:milan正在管理!

 

  

到此这篇关于深入解析Java多态进阶学习的文章就介绍到这了,更多相关Java多态内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: