zoukankan      html  css  js  c++  java
  • 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();
    而你其他具体的方法啊,其他的相关类的代码都不用改!这就是他的意义。“

    本文是引用自百度知道的一个问题和解答。

  • 相关阅读:
    5285: [Hnoi2018]寻宝游戏
    CF 1117 E. Decypher the String
    4515: [Sdoi2016]游戏
    CF 1051 G. Distinctification
    4820: [Sdoi2017]硬币游戏
    HNOI2019游记
    最近公共祖先(LCT)
    [WC2006]水管局长(LCT)
    P4178 Tree(点分治)
    二维凸包
  • 原文地址:https://www.cnblogs.com/wwwhza/p/6549459.html
Copyright © 2011-2022 走看看