科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java方法重写问题

Java方法重写问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java方法重写问题

作者:csdn 来源:csdn 2009年12月17日

关键字: 问答 JavaSE java

  • 评论
  • 分享微博
  • 分享邮件

Java方法重写问题

方法重写可不可以改变返回值的类型?

如果不可以,那以下代码又怎么解释呢?

Java code
class A {
    public Object fun() {
        return null;
    }
}
class B extends A {
    public String fun() {
        return null;
    }
}

关于方法重写的一些特性:
  1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
  2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
  3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
根据2,3条是不是能确定第一条,子类方法的返回值必须是父类方法返回值的子类。
 

返回类型应该是要一致的,不过JAVA也会做一个类型检查,只要是类型兼容就可以了。
比如你举那个例子是类型Object->String是有继承关系的,
你可以试试把TestA中函数换成Integer试试,就不行了,因为Integer->String没有继承关系。
虽然有隐含的类型转换,建议还是写成一致比较好。

关于方法重写的一些特性:
  1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
  2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
  3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
根据2,3条是不是能确定第一条,子类方法的返回值必须是父类方法返回值的子类。

 

根据重写的定义看返回值是要类型一致的。
这个问题主要是对 类型一致 这个概念的理解问题
一般认为类型一致就是要完全一对致。
可是通过这个例子看JVM并不是这样理解的。
只要类型转换可以通过JVM似乎就理解为类型一致了。

 

在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

 

编译是可以通过的!上面的例子中子类对父类的方法返回类型并没有改写,只是“子类方法的返回值必须是父类方法返回值的子类”(引用4楼的话),String肯定是Object的子类,可以说子类已经成功的重写了父类的方法。但如果子类的返回类型是父类方法返回值类型的父类,将会编译错,如果子类用的是基本类型,也一样报错。

 

方法的重写不就是覆盖吗?返回值当然要一样,只是方法体不一样,子类方法覆盖了父类的方法,子类对象调用子类自己的方法,父类对象调用父类的方法,成员变量同名的情况下是“隐藏”,父类同名对象被隐藏,子类可以通过super来调用父类成员变量,方法同名的时候就是覆盖了!

 

方法的重写是子类对继承自父类的方法进行重新定义,并且方法名,返回类型,参数个数要与父类一致。 至于上面的程序,我觉得因为String是object的一个子类所以还是可以的,如果换成两个没有继承关系的类型,那就不行了
 


 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章