Java 多態
JAVA多態
多態性是指對象能夠有多種形態。在OOP中最常常的多態性發生在當父類引用指向孩子類對象時。
任何能夠通過一個以上的IS-A測試的Java對象被認為是多態的。在Java中所有對象都是多態的,因為任何一個對象都會有一個他們自己類型的和對象類的IS-A關係。
重要的是知道,通過引用變數是唯一可以用來訪問一個對象的方法。引用變數可以只有一個類型。引用變數一旦被聲明是不能被改變的。
引用變數能夠重新分配到其他提供的沒有被聲明為final的對象。引用變數的類型將決定它可以調用的對象的方法。
一個引用變數能夠引用任何一個對象的聲明類型或任何聲明類型的子類型。一個引用變數可以聲明為一個類或介面類型。
示例
讓我們看下面的例子:
public interface Vegetarian {}
public class Animal {}
public class Deer extends Animal implement素食者{}
現在Deer類是多態的,因為他有多個繼承機制。針對上面的例子有以下說法:
鹿就是動物
鹿就是素食主義者
鹿就是鹿
鹿就是對象
當我們提供引用變數來引用Deer對象,下面的聲明是合法的
鹿d =新鹿();
動物a = d;
素食v = d;
對象o = d;
所有的引用變數d,a,v,o在堆中引用同一個對象鹿
虛方法
在這一節中,將展示在Java中被覆蓋方法的行為在設計類時間是如何體現多態性的好處的。
我們已經討論了覆蓋方法,一個子類可以覆蓋它父類的方法。一個被覆蓋的方法實際上隱藏在父類當中,並且不會被調用,除非子類在覆蓋方法中超級關鍵字。
/ *文件名:Employee.java * /
public class Employee
{
private String name;
私人字元串地址;
私有int數;
public Employee(String name,String address,int number)
{
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck()
{
+「」+ this.address);
}
public String toString()
{
return name +「」+ address +「」+ number;
}
public String getName()
{
return name;
}
public String getAddress()
{
return address;
}
public void setAddress(String newAddress)
{
address = newAddress;
}
public int getNumber()
{
return number;
}
}
現在我們如下繼承員工類型:
/ *文件名:Salary.java * /
public class Salary extends Employee
{
private double salary; //年薪salary
(字元串名稱,字元串地址,int number,double
salary)
{
super(name,address,number);
setSalary(工資);
}
public void mailCheck()
{
+「with salary」+ salary);
}
public double getSalary()
{
return salary;
}
public void setSalary(double newSalary)
{
if(newSalary> = 0.0)
{
salary = newSalary;
}
}
public double computePay()
{
回報/ 52;
}
}
現在,你仔細研究下面的程序,試圖確定它的輸出:
/ *文件名:VirtualDemo.java * /
public class VirtualDemo
{
public static void main(String [] args)
{
Salary s = new Salary(「Mohd Mohtashim」,「Ambehta,UP」,3,3600.00);
員工e =新工資(「約翰·亞當斯」,「波士頓,MA」,2,2400.00);
s.mailCheck();
e.mailCheck();
}
}
這將產生如下的結果:
構建員工
構建員工
電子郵件MailCheck使用薪資參考 -
在薪資類別的
郵件中檢查到Mohd Mohtashim工資3600.0
使用僱員參考調用mailCheck -
在薪資類別的
郵件中檢查到約翰·亞當斯與工資2400.0
這裡我們實例化兩個工資對象。一個用薪水引用,另一個用Employee引用e。
當調用s.mailCheck()方法時,編譯器在編譯時發現mailCheck()在Salary類中,並且JVM在運行時調用Salary類的mailCheck()方法。
調用e的mailCheck()是略有不同的因為e是一個Employee的引用。當編譯器發現e.mailCheck()時,編譯器在Employee類中發現mail.Check()方法。
這裡在編譯時,編譯器使用Employee的mailCheck()方法來驗證。在運行時,JVM調用Salary類的mailCheck()類。
這種行為被稱為虛方法調用,該方法也被稱為虛方法.Java中所有此規則的方法行為,無論是什麼數據類型的引用,運行時調調被覆蓋方法,在編譯時都會遵循於源碼。


※Java 包
※給Java零基礎小白的初級總結 一
※JAVA 封裝
※Java 新手問題匯總 一1
※Java 繼承
TAG:java吧 |