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