问答详情
源自:2-1 JDK中的注解

为什么必须用Person p=new Child();才会显示下划线

而Child c=new Child();不会出现下划线

提问者:深夜雀电台 2015-12-15 19:39

个回答

  • Sean_Chou
    2017-12-04 22:38:54

    //1 有警告,需忽略
    Person p = new Child();
    //2 无警告
    Child p = new Child();
    
    p.sing();

    new Child()创建了Child类的实例化对象,变量p引用了这个Child类的对象,所以p是引用变量,而p前面的类名则表明p的类型,即是Person类型或者Child类型。

    Person类型下的方法已经过时,而Child类型依然实现了这个方法(注意这里的“过时”的意思,老师讲的时候是说sing()方法定义得不太合适,因为有些类根本不需要实现这个方法,就像有些人不会唱歌,但是标准里却有唱歌这个标准)。所以如果要将引用变量声明为Person类型并去调用过时的sing()方法是不合适的,所以要有警告;然而就像有些人还是很会唱歌的,若声明为Child类型的并去调用sing()方法,它不仅会唱,唱得还非常好,是再合适不过了,所以就无需警告。我觉得还是要理解“过时”的含义,过时不是错,只是不适用于大多数。

    ######

    这也只是我的理解,觉得我理解得也不透彻,因为也注意到了这个问题,所以才这样关注。以后也会继续关注的。

  • 香飘飘丶
    2016-07-18 21:20:04

    子类Child覆盖了父类的方法   使用了@Override

    但是父类Person 修饰了一个已经过时的方法  使用了@Deprecated

    此时强行调用父类继承来的方法就会有个代码过时的横线,并且报一个代码过时的警告,但不会影响正常使用。

    如果要去掉警告可以使用  @suppressWarings("deprecation")  来忽略这个警告


  • 慕前端0336099
    2016-04-11 18:35:31

    你不NEW个出来就不会调用  都不用他当然不管你是不是过时了


  • lx_script
    2016-01-31 16:37:26

    有可能child的构造函数标记为已过时

  • 执念_00
    2015-12-15 21:11:00

    类型对应当然不会有下划线;对应不上才会