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();
而你其他具体的方法啊,其他的相关类的代码都不用改!这就是他的意义。“
本文是引用自百度知道的一个问题和解答。