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();
而你其他具體的方法啊,其他的相關類的代碼都不用改!這就是他的意義。“
本文是引用自百度知道的一個問題和解答。
