Java實例講解多態(tài)數(shù)組的使用
多態(tài)概述
多態(tài)概念:所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現(xiàn)上,從而導(dǎo)致該引用變量調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態(tài),這就是多態(tài)性。
多態(tài)存在的三個必要條件
1.要有繼承關(guān)系的存在(實現(xiàn)接口也是一種繼承關(guān)系)
2.要有方法的重寫
3.要有父類引用指向子類對象
注:
1. 運行方法看運行類型,屬性看編譯類型
2.在方法中調(diào)用屬性,無特殊情況為本類屬性
3.若類型中沒有調(diào)用的方法,遵循向上查詢
1.向上轉(zhuǎn)型
1.對象的向上轉(zhuǎn)型,其實就是多態(tài)寫法:
格式: 父類名稱 對象名 = new 子類名稱();
含義:右側(cè)創(chuàng)建了一個子類對象,把它當(dāng)作父類來看待使用。
Person person=new student();
創(chuàng)建了一個學(xué)生對象,當(dāng)作人看待,沒有問題。
此時的編譯類型為person,運行類型為學(xué)生;
注意事項:向上轉(zhuǎn)型一定是安全的。從小范圍轉(zhuǎn)向了大范圍,從小范圍的貓,向上轉(zhuǎn)換成為更大范圍的動物
2.向下轉(zhuǎn)型
2.對象的向下轉(zhuǎn)型,其實就是一個還原的動作:
格式: 子類名稱 對象名 =(子類名稱) 父類對象;
含義:將子類還原,還原成為本來的子類對象
Cat cat =(Cat) animal;//本來是貓,向上轉(zhuǎn)型成為動物,還原回來成為本來的貓 注意事項:
a.必須保證對象本來創(chuàng)建的時候就是貓,才能向下轉(zhuǎn)型成為貓
b.如果對象創(chuàng)建的時候不是貓,現(xiàn)在非要向下轉(zhuǎn)型成為貓,就會報錯
多態(tài)數(shù)組
建立一個polyArr包
Arrtest.java
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++) { //動態(tài)綁定機制 //person[i]編譯類型是Person,運行類型是根據(jù)實際情況判斷的 System.out.println(p[i].say()); } } }
Person.java
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; } }
Student.java
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; } }
Teacher.java
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; } }
運行結(jié)果
多態(tài)數(shù)組+向下轉(zhuǎn)型
instanceof關(guān)鍵字
運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。
用法: result = object instanceof class
result為boolean類型
參數(shù):
Result:布爾類型。
Object:必選項。任意對象表達式。
Class:必選項。任意已定義的對象類。
說明:
如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object
不是指定類的一個實例,或者 object 是 null,則返回 false。
但是instanceof在Java的編譯狀態(tài)和運行狀態(tài)是有區(qū)別的;
注:
在編譯狀態(tài)中,class可以是object對象的父類,自身類,子類。在這三種情況下Java編譯時不會報錯。
在運行轉(zhuǎn)態(tài)中,class可以是object對象的父類,自身類,不能是子類。在前兩種情況下result的結(jié)果為true,最后一種為false。但是class為子類時編譯不會報錯。運行結(jié)果為false。
建立一個polyArr包
Arrtest.java
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++) { //動態(tài)綁定機制 //person[i]編譯類型是Person,運行類型是根據(jù)實際情況判斷的 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()); } } } }
Person.java
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; } }
Student.java
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()+"正在聽講"; } }
Teacher.java
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()+"正在上課"; } }
運行結(jié)果
到此這篇關(guān)于Java實例講解多態(tài)數(shù)組的使用的文章就介紹到這了,更多相關(guān)Java多態(tài)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 在項目啟動之后執(zhí)行自定義方法的兩種方式小結(jié)
這篇文章主要介紹了SpringBoot 在項目啟動之后執(zhí)行自定義方法的兩種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09解決springboot與springcloud版本兼容問題(附版本兼容表)
在基于spring boot搭建spring cloud時,創(chuàng)建eureka后啟動服務(wù)發(fā)生報錯,本文給大家介紹了解決springboot與springcloud版本兼容問題的幾種方案,需要的朋友可以參考下2024-02-02SpringBoot打War包上傳到阿里云的LINUX服務(wù)器的操作方法
這篇文章主要介紹了SpringBoot打War包上傳到阿里云的LINUX服務(wù)器,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02SpringCloud讓微服務(wù)實現(xiàn)指定程序調(diào)用
這篇文章主要介紹了SpringCloud讓微服務(wù)實現(xiàn)指定程序調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06