Java中的動態(tài)綁定機制
JAVA動態(tài)綁定機制(非常非常重要)
JAVA動態(tài)綁定機制:動態(tài)綁定是與運行類型進行綁定
1.當調(diào)用對象方法的時候,該方法會和該對象的內(nèi)存地址/運行類型(也就是與運行類型)綁定(意思就是如:有一個Cat類,Cat類中有一個cay方法,這個方法會和Cat類發(fā)生動態(tài)綁定)
2.當調(diào)用對象屬性時,沒有動態(tài)綁定機制,哪里聲明,哪里使用
package JAVA面向?qū)ο笾屑壊糠?encapsulationAndInherit.binding; public class DynamicBinding { public static void main(String[] args) { A a = new B();//向上轉(zhuǎn)型 //當注釋了B類中的sum()方法和sum1()方法結(jié)果變?yōu)榱?0和20 System.out.println(a.sum());//40 --》30 System.out.println(a.sum1());//30 --》20 } } class A{//父類 public int i = 10; //由于調(diào)用方法時,方法會和該對象的內(nèi)存地址(也就是運行類型)綁定 //由于運行類型是B,所以查找是從B類方法開始查找,要因為B類中的getI()方法,直接返回屬性i,屬性沒有動態(tài)綁定機制,因此直接返回20 public int sum(){ return getI()+10; } //方法是有動態(tài)綁定機制,所以查找時,先從子類B查找,由于B類沒有sum1方法, //繼承查找父類,父類有則調(diào)用sum1方法,要因為sum1方法返回是屬性i,屬性沒有動態(tài)綁定機制直接返回i的值,所以是20 public 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; } }
多態(tài)應用
基本介紹:
多態(tài)數(shù)組是數(shù)組定義類型為父類類型,里面保存的實際元素類型為子類類型
案例:
1.現(xiàn)有一個繼承結(jié)構(gòu)如下:要求創(chuàng)建一個Person對象,2個Student對象和2個Teacher對象,統(tǒng)一放在數(shù)組中。并調(diào)用msay方法。
2.應用實例升級,如何調(diào)用子類特有的方法,比如Teacher有一個teach,Student有一個study怎么調(diào)用?
package JAVA面向?qū)ο笾屑壊糠?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面向?qū)ο笾屑壊糠?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){ //注意在構(gòu)造器中使用super和this調(diào)用構(gòu)造器完成初始化,兩者只能出一個并且放在第一條語句 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面向?qū)ο笾屑壊糠?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面向?qū)ο笾屑壊糠?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); //循環(huán)遍歷多態(tài)數(shù)組,調(diào)用say for (int i = 0; i < people.length; i++) { //person[i]編譯類型是Person,運行類型是根據(jù)實際情況有JV來判斷 // System.out.println(people[i].say());//動態(tài)綁定機制 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());//在類型轉(zhuǎn)換時,范圍大的一定要放在后面,要不大的對小范圍有接收作用 } } } }
多態(tài)參數(shù)問題
基本介紹:
方法定義的形參類型為父類類型,實參類型允許為子類類型
應用實例1:前面的主人喂動物
應用實例2:
定義員工類Employee,包含姓名和月工資【prvate】,以及計算年工資getAnnual的方法。普通員工和經(jīng)理繼承了員工,經(jīng)理類多了獎金bonus屬性和管理manage方法,普通員工類多了work方法,普通員工和經(jīng)理類要求分別重寫getAnnual方法
測試類中添加一個方法showEmpAnnal(Employee employee),實現(xiàn)獲取任何員工對象的年工資,并在main方法中調(diào)用該方法【employee.getAnnual()】
測試類中添加一個方法,testWork,如果是普通員工,則調(diào)用work方法,如果是經(jīng)理,則調(diào)用manage方法
package JAVA面向?qū)ο笾屑壊糠?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("=================經(jīng)理==============="); ? ? ? ? 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面向?qū)ο笾屑壊糠?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面向?qū)ο笾屑壊糠?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面向?qū)ο笾屑壊糠?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("經(jīng)理放屁了"); ? ? } ? ? public double getAnnual(){ ? ? ? ? return getSalary()*12 + bonus; ? ? } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Elasticsearch查詢Range Query語法示例
這篇文章主要為大家介紹了Elasticsearch查詢Range Query語法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04詳解spring cloud config實現(xiàn)datasource的熱部署
這篇文章主要介紹了詳解spring cloud config實現(xiàn)datasource的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01基于mybatis?plus實現(xiàn)數(shù)據(jù)源動態(tài)添加、刪除、切換,自定義數(shù)據(jù)源的示例代碼
這篇文章主要介紹了基于mybatis?plus實現(xiàn)數(shù)據(jù)源動態(tài)添加、刪除、切換,自定義數(shù)據(jù)源,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù)的示例代碼
這篇文章主要介紹了springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù),其實kettle集成到springboot里面沒有多少代碼,這個功能最主要的還是ktr文件的編寫,只要ktr編寫好了,放到指定文件夾下,寫個定時任務就完事了,需要的朋友可以參考下2022-12-12SpringBoot2零基礎到精通之數(shù)據(jù)與頁面響應
SpringBoot是一種整合Spring技術棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架2022-03-03