JAVA动态绑定机制(非常非常重要)

JAVA动态绑定机制动态绑定是与运行类型进行绑定

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

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

package JAVA面向对象中级部分.encapsulationAndInherit.binding;public class DynamicBinding {public static void main(String[] args) {A a  = new B();//向上转型//当注释了B类中的sum()方法和sum1()方法结果变为了30和20System.out.println(a.sum());//40 --》30System.out.println(a.sum1());//30 --》20}
}class A{//父类public int i = 10;//由于调用方法时,方法会和该对象的内存地址(也就是运行类型)绑定//由于运行类型是B,所以查找是从B类方法开始查找,要因为B类中的getI()方法,直接返回属性i,属性没有动态绑定机制,因此直接返回20public int sum(){return getI()+10;}//方法是有动态绑定机制,所以查找时,先从子类B查找,由于B类没有sum1方法,//继承查找父类,父类有则调用sum1方法,要因为sum1方法返回是属性i,属性没有动态绑定机制直接返回i的值,所以是20public int sum1(){return i+10;}public int getI(){return i;}
}class B extends A {public int i = 20;
//    public int sum(){//        return i+20;
//    }
//
//    public int sum1(){//        return i+10;
//    }public int getI(){return i;}
}

多态应用

基本介绍:多态数组是数组定义类型为父类类型,里面保存的实际元素类型为子类类型

案例:

1.现有一个继承结构如下:要求创建一个Person对象,2个Student对象和2个Teacher对象,统一放在数组中。并调用msay方法。
2.应用实例升级,如何调用子类特有的方法,比如Teacher有一个teach,Student有一个study怎么调用?

package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String say(){return "姓名:"+name+"\t年龄:"+age;}}package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Student extends  Person{private double score;public Student(String name,int age) {this.setName(name);this.setAge(age);}public Student(String name,int age,double score){//注意在构造器中使用super和this调用构造器完成初始化,两者只能出一个并且放在第一条语句super(name,age);
//        this(name,age);this.score =score;}public String say(){return super.say()+"\t成绩:"+score;}public void study(){System.out.println("学生:"+getName()+"正在学习JAVA课程!");}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Teacher extends  Person{private double salary;public Teacher(String name,int  age) {this.setName(name);this.setAge(age);}public Teacher(String name,int age,double salary){super(name,age);this.salary = salary;}public String say(){return super.say()+"\tsalary:"+salary;}public void teach(){System.out.println("老师:"+getName()+"正在教JAVA课程!");}
}package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class PloyArray {public static void main(String[] args) {Person[] people = new Person[5];people[0] = new Person("海康",20);people[1] = new Student("湛江",18,99);people[2] = new Student("南宁",20,99.9);people[3] = new Teacher("西安",21,21688);people[4] = new Teacher("广州",22,22168);//循环遍历多态数组,调用sayfor (int i = 0; i < people.length; i++) {//person[i]编译类型是Person,运行类型是根据实际情况有JV来判断
//            System.out.println(people[i].say());//动态绑定机制if (people[i] instanceof Student){Student student = (Student) people[i];student.study();}else if (people[i] instanceof  Teacher){Teacher teacher = (Teacher) people[i];teacher.teach();}else {System.out.println(people[i].say());//在类型转换时,范围大的一定要放在后面,要不大的对小范围有接收作用}}}
}

多态参数问题

基本介绍:方法定义的形参类型为父类类型,实参类型允许为子类类型

应用实例1:前面的主人喂动物

应用实例2:

定义员工类Employee,包含姓名和月工资【prvate】,以及计算年工资getAnnual的方法。普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方法,普通员工类多了work方法,普通员工和经理类要求分别重写getAnnual方法测试类中添加一个方法showEmpAnnal(Employee employee),实现获取任何员工对象的年工资,并在main方法中调用该方法【employee.getAnnual()】测试类中添加一个方法,testWork,如果是普通员工,则调用work方法,如果是经理,则调用manage方法package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class PloyParameter {public static void main(String[] args) {Worker worker = new Worker("海康", 18168);testWork(worker);double v = showEmpAnnual(worker);System.out.println(v);System.out.println("=================经理===============");Manager manager = new Manager("明天", 81688, 100000);testWork(manager);double v1 = showEmpAnnual(manager);System.out.println(v1);}public static double showEmpAnnual(Employee employee){return employee.getAnnual();}public static void testWork(Employee employee){if (employee instanceof Worker){Worker worker = (Worker) employee;worker.work();}else if (employee instanceof Manager){Manager manager = (Manager) employee;manager.manage();}else {System.out.println("您输入的类型有误!");}}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Employee {private String name;private double salary;public Employee() {}public Employee(String name,double salary){this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//计算年工资getAnnual方法public double getAnnual(){return salary*12;}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Worker  extends Employee{public Worker() {}public Worker(String name, double salary) {super(name, salary);}//普通员工work方法public void work(){System.out.println("普通员工打工干活");}public double getAnnual(){return getSalary()*12;}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Manager extends Employee{private double bonus;public Manager(String name,double salary){super(name,salary);}public Manager(double bonus) {this.bonus = bonus;}public Manager(String name, double salary, double bonus) {super(name, salary);this.bonus = bonus;}//管理方法public void manage(){System.out.println("经理放屁了");}public double getAnnual(){return getSalary()*12 + bonus;}
}

JAVA动态绑定机制相关推荐

  1. Java动态绑定机制的内幕

    在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...

  2. java 动态绑定原理_详解Java动态绑定机制的内幕(图)

    在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto ...

  3. Java动态绑定机制详解

    关于 java 的动态绑定机制 聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解. 网上大多一言概括: 当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定. 当调用对象的属性 ...

  4. JAVA多态机制简述

    多态是指方法或对象具有多种形态,是oop的第三大特征,其是建立在封装和继承之上的. 多态的体现: 1.方法多态---1.重载体现多态2.重写体现多态 2.对象多态: (1)对象的编译类型和运行类型可以 ...

  5. Java笔记013-IDEA、包、访问修饰符、封装、继承、多态、Super、方法重写/覆盖(override)、java的动态绑定机制

    目录 面向对象编程(中级部分) IDE(集成开发环境)-IDEA IDEA介绍 IDE(集成开发环境)-Eclipse Eclipse介绍 IDEA的安装 IDEA的基本介绍和使用 创建一个java项 ...

  6. java的多态和动态绑定机制

    什么是多态,多态具体体现在哪些方面? 多态:方法或者对象具有多挣形态,是OOP的第三大特征,是建立在封装和继承期初之上的多态具体表现, 1.方法多态 (1)重载体现多态, (2)重写体现多态 2.对象 ...

  7. java的动态绑定机制

    文章目录 Java重要特性:动态绑定机制 案例1(引入) 案例2(动态绑定机制-调用对象方法) 案例3(动态绑定机制-调用对象属性) Java重要特性:动态绑定机制 案例1(引入) public cl ...

  8. JAVA多态的动态绑定机制

    对于多态,大家基本上都很熟悉,日常开发用的也挺多,一句话概括:父类引用指向子类对象 在集合的使用上,List mList = new ArrayList<>(); 在类的继承时,Anim ...

  9. 【java】动态绑定机制

    (1)当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定. (2)当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用.

最新文章

  1. Spring学习总结(7)——applicationContext.xml 配置文详解
  2. 李彦宏AI布局又下一城,成立生命科学公司“百图生科”
  3. python utc时间转换为strftime
  4. linux裁剪—定制自己所需要的linux
  5. [CQOI2016]手机号码 数位DP
  6. asp.net MVC控制器中返回JSON格式的数据时提示下载
  7. 技术停滞_检测和测试停滞的流– RxJava常见问题解答
  8. lua的string.gsub初使用
  9. 【Groovy】Groovyc: Internal groovyc error: code 1 的解决方法
  10. es6 Class 的静态方法
  11. python获取Linux信息
  12. 使用ActivityGroup管理Activity
  13. 9种退出极域课堂的方法
  14. 草莓换个做法,迫不及待想要吃
  15. 【LeetCode】马三来刷题之Permutations
  16. 【运筹帷幄】网站打开慢故障排查思路
  17. 连上wifi浏览器不能上网微信却可以登陆
  18. 电脑忘记密码了怎么办
  19. 甲骨文称将出示李艾科犯罪证据 与惠普较劲
  20. angular.js 错误: Error [$injector:unpr] 原因

热门文章

  1. POJ 1026 Cipher G++
  2. Scrapy爬取盗墓笔记 0.2版(mongedb redis)
  3. Protobuf学习
  4. Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
  5. java中br.readLine与 br.read的用法区别
  6. 阿里安全图灵实验室炫谦:如何成长为一名优秀的AI算法工程师?
  7. GRR(Gauge Repeatability and Reproducibility)
  8. gnome桌面 kde_GNOME和KDE在Linux桌面上合作,为Nvidia GPU打开文档,这是一种强大的扫描固件漏洞的新方法,还有更多新闻...
  9. 高效使用远程PPT演示的六大要点
  10. 互联网十大岗位薪资排行榜