Java向上轉型的意義


 1 比如我這個程序
 2 public class Testjava{
 3 public static void main(String args[])
 4 {
 5 fun(new Student());
 6 fun(new Allen());
 7 
 8 }
 9 public static void fun(Person p)
10 {
11 p.fun2();
12 if (p instanceof Student)
13 {
14 Student s=(Student)p;
15 s.fun3();
16 }
17 if (p instanceof Allen)
18 {
19 Allen a=(Allen)p;
20 a.fungod();
21 }
22 }
23 }

問題:fun3()和fungod()分別是Student類和Allen類里面的方法,我想調用他們的時候為什么要向上轉型呢,感覺沒什么意義,直接寫Student s=new Student()和Allen a=new Allen()各建立一個新對象再調用他們各自特有的方法不就可以了嗎?

 

理解:”這個跟java面向對象的特性有關,是多態的表現特點
public static void fun(Person p)就像你這里的這個參數,如果不用person,而是用student或者allen

那你這個方法的可利用率就低了。但如果用person,那這個方法既可以匹配student,又可以匹配allen
再比如你的程序開始的時候確定有一個person型對象,但是要根據用戶的選擇來決定他要被實例化成哪種類型的。但如果你要分開來聲明的話,那你就因為不確定性必須要聲明兩個變量,分別來等待實例化。

你這個程序里就只有public static void fun(Person p)這一個方法,如果說是分成兩個單獨的類,要改的話就只需要改這一個參數。。。。
但是后面做大程序的時候,往往好幾十個方法,如果你不用person,而用了student,那你一旦在寫程序的時候發現這里應該用allen而不是student,而你又沒用person,那你這里一改就要改N多的地方,而且一改動很有可能會引發其他的錯誤,而且你這些方法很有可能又被其他的類所調用,那其他的類肯定也要跟着改啊,那這個改動量就非常大了。
比如說你的public static void fun(Student p)要傳進來一個Allen類型的對象,必然報錯,要改是吧~

但是如果你使用的person,那你只需要改動它實例化的語句就ok了,上面這么大的改動量現在只需要改一句話。
就是將
Person p=new Student();
改為
Person p=new Allen();
而你其他具體的方法啊,其他的相關類的代碼都不用改!這就是他的意義。“

 

本文是引用自百度知道的一個問題和解答。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM