java中函数覆盖(即重写override),子类的返回类型一定要和父类一样吗?
2017-09-22 11:01
507 查看
分情况的,第一种情况:jdk1.4及之前的版本返回类型必须完全一样。第二种情况:jdk1.5及之后的版本,返回类型可以是父类返回类型的兼容类型。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
关于重写,遵循以下的规则:
(1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。
(2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个protected的方法)。
(3)只有实例方法才能被重写,超类中的final方法不能被重写。
(4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常。
(5)注意一种特殊情况:如果超类的方法版本中声明了检查异常,但重写的子类方法中没有声明,这时如果使用多态的方式进行调用,那么编译器认为你调用的是声明了异常的方法。
(6)尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。
Java的重载机制:
重载的实质:在一个类中使用签名相同的多个方法。
按照范围,可以将重载分为在一个类中重载,和在子类和父类中重载。现分别解释如下:
1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表,比如一个类的构造函数。
2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表),这个地方很容易和重写相混淆,因此千万注意。
重载的规则主要记住亮点:
一是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序。
二是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改。实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
关于重写,遵循以下的规则:
(1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。
(2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个protected的方法)。
(3)只有实例方法才能被重写,超类中的final方法不能被重写。
(4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常。
(5)注意一种特殊情况:如果超类的方法版本中声明了检查异常,但重写的子类方法中没有声明,这时如果使用多态的方式进行调用,那么编译器认为你调用的是声明了异常的方法。
(6)尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。
Java的重载机制:
重载的实质:在一个类中使用签名相同的多个方法。
按照范围,可以将重载分为在一个类中重载,和在子类和父类中重载。现分别解释如下:
1.在一个类中定义多个具有相同签名的方法,这些方法必须具有不同的参数列表,比如一个类的构造函数。
2.在父类和子类中,子类由于继承而拥有了父类的某些方法,此时在子类再定义具有相同签名的方法(必须具有不同的参数列表),这个地方很容易和重写相混淆,因此千万注意。
重载的规则主要记住亮点:
一是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序。
二是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改。实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字。
相关文章推荐
- Java 子类继承父类方法的重写(或者覆盖,override)
- C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?
- 【Java 小实验】重写(覆写 Override)返回值类型能不能相同
- java中父类有static修饰的方法其子类能继承吗?若子类也有该方法,是覆盖还是重写?
- C++父类子类间函数重定义,虚函数重写(覆盖)以及重载
- C++和Java在 子类继承父类时,两者成员函数重写和重载的特性
- Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
- 函数重载,函数重写(虚函数重写),函数重定义(非虚函数重写),以及名称覆盖(函数重定义时,与父类参数个数不同,或是参数类型不同)
- 2018/01/07JAVA 基础 / 接口与继承:重写【子类继承并覆盖父类的对象方法】、隐藏【子类继承并覆盖父类的类方法】与实现类实现接口方法の区别
- java 抽象父类方法返回子类的类型
- 子类中的方法和父类同名,但是参数不同,是重写(overload)不是覆盖(override)
- 【C++】子类在重写虚函数时,会覆盖父类的函数
- C++和Java在 子类继承父类时,两者成员函数重写和重载的特性
- java 子类继承父类 -- 重写、覆盖与多态
- java 子类继承父类 -- 重写、覆盖
- C#中子类对父类中虚方法的处理有重写(override)和覆盖(new),他们有什么区别?
- 子类对父类中虚方法的处理有重写(override)和覆盖(new)的区别
- C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
- 父类和子类的同名成员函数参数格式相同,返回值类型不同
- java学习,子类覆盖父类及重写的相关学习