继承过程中子类重写父类方法的现象
1.如下例
package net.oschina.tkj.chapter8.returntype; /** * 协变返回类型 * @author Freedom * */ public class Grain { public String toString(){ return "grain"; } } package net.oschina.tkj.chapter8.returntype; /** * 此时该类并未继承Grain 类 * @author Freedom * */ public class Wheat { public String toString(){ return "wheat"; } } /** * WheatMilk的父类 * @author Freedom * */ public class Milk { public Grain process(){ return new Grain(); } } package net.oschina.tkj.chapter8.returntype; /** * Milk的子类 * @author Freedom * */ public class WheatMilk extends Milk { /** * 子类继承父类,子类重新定义了一个与父类方法名一样的方法但是返回值不一致,会出现调用不确定性编译出错 */ public Wheat process(){ return null; } }
上述代码编译时会报错:
错误原因:子类继承父类的过程中,在子类中声明了一个与父类方法名一样但返回值不一样的方法,就会出现调用的不确定性。
2.协变返回类型
2.1将上列修改为如下情况:
package net.oschina.tkj.chapter8.returntype; /** * 此时该类继承Grain 类 * @author Freedom * */ public class Wheat extends Grain { public String toString(){ return "wheat"; } }
此时,将Wheat类继承Grain类,Milk类及其子类保持不变,此时编译器不在报错。
2.1协变返回类型
Java SE5之后,子类继承父类重写父类的方法,子类重写方法的返回类型可以是父类方法的返回类型或者是父类方法返回类型的子类型
相关推荐
本教程将重点关注其中的一个重要特性——协变返回类型,从IL(Intermediate Language)层面进行深入剖析。IL是.NET Framework中的中间语言,是源代码编译后的产物,用于跨平台执行。了解IL有助于我们理解.NET框架的...
本文将深入探讨这个主题,并结合提供的`Test.java`文件,来理解如何在实际编程中应用协变返回类型。 首先,我们要明白什么是协变(Covariance)。在面向对象编程中,协变是指子类型可以被当作父类型来使用。例如,...
在Java编程语言中,协变返回类型是一种特性,它允许子类在重写父类方法时,返回一个比父类方法更具体的类型。这在某些情况下可以提高代码的灵活性和可读性。Java 5.0及后续版本开始支持这种协变特性。下面将详细解释...
协变返回类型和智能指针 协变返回类型是一种语言功能,它允许您将虚函数的返回类型更改为协变类型,即。 指向派生类的指针而不是指向基类的指针 - 请参见下面的示例: struct Figure { virtual ~Figure () = ...
当一个方法或委托只读取(不修改)参数类型的实例时,允许将该方法或委托的返回类型向上转型为它的基类型。例如,如果你有一个返回`IEnumerable<Animal>`的方法,而实际上它返回的是`IEnumerable<Cat>`,协变性允许...
自第一版以来,AspectJ已经取得了显著的发展和完善,本书涵盖了AspectJ最新的功能和改进,包括对Java注解的支持、泛型的支持以及对可变参数列表和协变返回类型的支持等。本书由AspectJ领域的专家Ramnivas Laddad撰写...
协变返回类型允许子类覆盖父类的方法时,返回类型可以是父类返回类型的子类型,这在泛型上下文中尤为重要,能够保持代码的灵活性和类型安全性。 #### 六、泛型的实际应用与注意事项 在实际编程中,合理运用泛型...
此外,书中还新增了断言和正则表达式的重要部分,涵盖了自动装箱、可变参数方法、增强型for循环和协变返回类型等所有新的语言特性。同时,本书也对Formatter和Scanner等关键新类进行了介绍。 《Java编程语言 第四版...
自Java 1.5起,接口方法的改写允许返回类型更加宽松,即子接口或实现类的方法返回类型可以是父接口方法返回类型的子类型,这是协变返回类型(covariant return type)。然而,如果方法的返回类型仅仅是不同的,那么...
从Java 7开始,子类方法的返回类型可以是父类返回类型的派生类,这称为协变返回类型。 3. **访问修饰符**:重写方法的访问权限不能低于被重写方法。比如,如果父类方法是`public`,子类重写方法不能声明为`...
- Java 5.0以后,返回类型可以是父类类型的任何子类,这被称为协变返回类型。 5. **super关键字**: - `super`关键字用于引用父类的成员,包括变量和方法。 - 在构造方法中,`super(参数列表)`用于调用父类的...
1. **协变返回类型**:子类型的方法返回了一个比基类型更具体的类型,这可能会导致类型安全问题。 2. **逆变参数类型**:子类型的方法接受一个比基类型更泛化的参数,这可能导致方法无法正确处理某些子类型的实例。 ...
- **协变返回类型(Covariant Return Types)**:这种方法允许子类重写父类的方法并改变其返回值的类型,但必须确保子类的返回类型是父类返回类型的子类型。 ##### 3. 新增的关键类 - **Formatter类**:提供了格式...
首先,协变是指在派生类和基类之间,方法返回类型可以安全地向上转型。这意味着,如果一个方法声明返回类型为基类,而实际上返回的是派生类的实例,这样的转换是允许的。在泛型中,这主要适用于只读操作或输出类型的...
子类的这个方法必须与父类方法有相同的名称、参数列表和返回类型(C++中返回类型必须相同,而C#等语言允许协变返回类型)。覆盖的目的是改变父类方法的行为,以实现更具体的功能。在运行时,根据对象的实际类型调用...
泛型的协变返回类型(Covariant Return Types)允许子类重写方法时返回比父类更具体的类型。 通过对比Java泛型和C++模板(Templates),我们可以看到两者在设计上有相似之处,但也有本质的区别。Java的泛型提供了比...
重写(Override)是指子类对父类中的方法进行重新实现,必须保证子类方法与父类方法具有相同的名称、参数列表和返回类型(协变返回类型除外)。重写体现运行时多态,与访问权限和抛出的异常也有关。重载与返回类型...
4. **语言新特性**:涵盖了从自动装箱、变长参数方法到增强的for循环和协变返回类型的全部新特性。 5. **新类覆盖**:介绍了如Formatter和Scanner等关键新类,这些类在处理格式化输出和输入方面极为有用。 本书系统...
从Java 5开始,子类的重写方法还可以拥有更具体的返回类型,这种特性被称为协变返回类型。 - **重载(Overload)**:则是在同一个类中,使用相同的方法名但参数列表不同的多个方法。重载方法的访问修饰符、抛出的异常...