多態概述
多態概念:所謂多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量到底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用變量調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。
多態存在的三個必要條件
1.要有繼承關系的存在(實現接口也是一種繼承關系)
2.要有方法的重寫
3.要有父類引用指向子類對象
注:
1. 運行方法看運行類型,屬性看編譯類型
2.在方法中調用屬性,無特殊情況為本類屬性
3.若類型中沒有調用的方法,遵循向上查詢
1.向上轉型
1.對象的向上轉型,其實就是多態寫法:
格式: 父類名稱 對象名 = new 子類名稱();
含義:右側創建了一個子類對象,把它當作父類來看待使用。
Person person=new student();
創建了一個學生對象,當作人看待,沒有問題。
此時的編譯類型為person,運行類型為學生;
注意事項:向上轉型一定是安全的。從小范圍轉向了大范圍,從小范圍的貓,向上轉換成為更大范圍的動物
2.向下轉型
2.對象的向下轉型,其實就是一個還原的動作:
格式: 子類名稱 對象名 =(子類名稱) 父類對象;
含義:將子類還原,還原成為本來的子類對象
Cat cat =(Cat) animal;//本來是貓,向上轉型成為動物,還原回來成為本來的貓 注意事項:
a.必須保證對象本來創建的時候就是貓,才能向下轉型成為貓
b.如果對象創建的時候不是貓,現在非要向下轉型成為貓,就會報錯
多態數組
建立一個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++)
{
//動態綁定機制
//person[i]編譯類型是Person,運行類型是根據實際情況判斷的
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;
}
}
運行結果
多態數組+向下轉型
instanceof關鍵字
運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。
用法: result = object instanceof class
result為boolean類型
參數:
Result:布爾類型。
Object:必選項。任意對象表達式。
Class:必選項。任意已定義的對象類。
說明:
如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object
不是指定類的一個實例,或者 object 是 null,則返回 false。
但是instanceof在Java的編譯狀態和運行狀態是有區別的;
注:
在編譯狀態中,class可以是object對象的父類,自身類,子類。在這三種情況下Java編譯時不會報錯。
在運行轉態中,class可以是object對象的父類,自身類,不能是子類。在前兩種情況下result的結果為true,最后一種為false。但是class為子類時編譯不會報錯。運行結果為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++)
{
//動態綁定機制
//person[i]編譯類型是Person,運行類型是根據實際情況判斷的
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()+"正在上課";
}
}
運行結果
到此這篇關于Java實例講解多態數組的使用的文章就介紹到這了,更多相關Java多態數組內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!