您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java多態(tài)數(shù)組如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java多態(tài)數(shù)組如何使用”吧!
多態(tài)概念:所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用變量調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。
多態(tài)存在的三個(gè)必要條件
1.要有繼承關(guān)系的存在(實(shí)現(xiàn)接口也是一種繼承關(guān)系)
2.要有方法的重寫
3.要有父類引用指向子類對象
注:
1. 運(yùn)行方法看運(yùn)行類型,屬性看編譯類型
2.在方法中調(diào)用屬性,無特殊情況為本類屬性
3.若類型中沒有調(diào)用的方法,遵循向上查詢
1.對象的向上轉(zhuǎn)型,其實(shí)就是多態(tài)寫法:
格式: 父類名稱 對象名 = new 子類名稱();
含義:右側(cè)創(chuàng)建了一個(gè)子類對象,把它當(dāng)作父類來看待使用。
Person person=new student();
創(chuàng)建了一個(gè)學(xué)生對象,當(dāng)作人看待,沒有問題。
此時(shí)的編譯類型為person,運(yùn)行類型為學(xué)生;
注意事項(xiàng):向上轉(zhuǎn)型一定是安全的。從小范圍轉(zhuǎn)向了大范圍,從小范圍的貓,向上轉(zhuǎn)換成為更大范圍的動(dòng)物
2.對象的向下轉(zhuǎn)型,其實(shí)就是一個(gè)還原的動(dòng)作:
格式: 子類名稱 對象名 =(子類名稱) 父類對象;
含義:將子類還原,還原成為本來的子類對象
Cat cat =(Cat) animal;//本來是貓,向上轉(zhuǎn)型成為動(dòng)物,還原回來成為本來的貓 注意事項(xiàng):
a.必須保證對象本來創(chuàng)建的時(shí)候就是貓,才能向下轉(zhuǎn)型成為貓
b.如果對象創(chuàng)建的時(shí)候不是貓,現(xiàn)在非要向下轉(zhuǎn)型成為貓,就會(huì)報(bào)錯(cuò)
建立一個(gè)polyArr包
package com.polyArr; public class Arrtest { public static void main(String[] args) { //父類的引用可以指向子類的對象 Person []p=new Person[5]; p[0]=new Person("aaa",15); p[1]=new Student("asas",16, 55); p[2]=new Student("ccc",17, 66); p[3]=new Teacher("nnn",18, 2000); p[4]=new Teacher("mmm",19, 6666); for(int i=0;i< p.length;i++) { //動(dòng)態(tài)綁定機(jī)制 //person[i]編譯類型是Person,運(yùn)行類型是根據(jù)實(shí)際情況判斷的 System.out.println(p[i].say()); } } }
package com.polyArr; public class Person { private String name; private int age; 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="+name+" age="+age; } }
package com.polyArr; public class Student extends Person{ private double score; public Student(String name, int age, double score) { super(name, age); this.score = score; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public String say(){ return super.say()+" score="+score; } }
package com.polyArr; public class Teacher extends Person { private int salary; public Teacher(String name, int age, int salary) { super(name, age); this.salary = salary; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public String say(){ return super.say()+" salary="+salary; } }
運(yùn)行結(jié)果
運(yùn)算符是用來在運(yùn)行時(shí)指出對象是否是特定類的一個(gè)實(shí)例。instanceof通過返回一個(gè)布爾值來指出,這個(gè)對象是否是這個(gè)特定類或者是它的子類的一個(gè)實(shí)例。
用法: result = object instanceof class
result為boolean類型
參數(shù):
Result:布爾類型。
Object:必選項(xiàng)。任意對象表達(dá)式。
Class:必選項(xiàng)。任意已定義的對象類。
說明:
如果 object 是 class 的一個(gè)實(shí)例,則 instanceof 運(yùn)算符返回 true。如果 object
不是指定類的一個(gè)實(shí)例,或者 object 是 null,則返回 false。
但是instanceof在Java的編譯狀態(tài)和運(yùn)行狀態(tài)是有區(qū)別的;
注:
在編譯狀態(tài)中,class可以是object對象的父類,自身類,子類。在這三種情況下Java編譯時(shí)不會(huì)報(bào)錯(cuò)。
在運(yùn)行轉(zhuǎn)態(tài)中,class可以是object對象的父類,自身類,不能是子類。在前兩種情況下result的結(jié)果為true,最后一種為false。但是class為子類時(shí)編譯不會(huì)報(bào)錯(cuò)。運(yùn)行結(jié)果為false。
建立一個(gè)polyArr包
package com.polyArr; public class Arrtest { public static void main(String[] args) { //父類的引用可以指向子類的對象 Person []p=new Person[5]; p[0]=new Person("aaa",15); p[1]=new Student("asas",16, 55); p[2]=new Student("ccc",17, 66); p[3]=new Teacher("nnn",18, 2000); p[4]=new Teacher("mmm",19, 6666); for(int i=0;i< p.length;i++) { //動(dòng)態(tài)綁定機(jī)制 //person[i]編譯類型是Person,運(yùn)行類型是根據(jù)實(shí)際情況判斷的 System.out.println(p[i].say()); if(p[i] instanceof Student) { Student t1=(Student) p[i]; System.out.println(t1.learn()); } else if(p[i] instanceof Teacher) { Teacher t1=(Teacher) p[i]; System.out.println(t1.teach()); } } } }
package com.polyArr; public class Person { private String name; private int age; 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="+name+" age="+age; } }
package com.polyArr; public class Student extends Person{ private double score; public Student(String name, int age, double score) { super(name, age); this.score = score; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public String say(){ return super.say()+" score="+score; } public String learn(){ return getName()+"正在聽講"; } }
package com.polyArr; public class Teacher extends Person { private int salary; public Teacher(String name, int age, int salary) { super(name, age); this.salary = salary; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public String say(){ return super.say()+" salary="+salary; } public String teach(){ return getName()+"正在上課"; } }
運(yùn)行結(jié)果
感謝各位的閱讀,以上就是“Java多態(tài)數(shù)組如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java多態(tài)數(shù)組如何使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。