Java 编程中的协变返回类型。

java 8object oriented programmingprogramming更新于 2024/10/13 13:57:00

如果两个类处于继承关系中,即如果一个类扩展了另一个类,则在子类中创建超类成员的副本。如果超类和子类都具有相同的方法(例如,sample()),则对于子类对象,两种方法都可用。

现在,如果您使用子类对象调用它,则子类中该方法的主体将执行,并覆盖超类方法。

示例

class Super{
   public void demo() {
      System.out.println("This is the method of the superclass");
   }
}
public class Sub extends Super{
   public void demo() {
      System.out.println("这是子类的方法");
   }
    public static void main(String args[]){
      Sub sub = new Sub();
      sub.demo();
   }
}

输出

这是子类的方法

协变返回类型

直到 Java5,子类方法覆盖超类的两个方法也应该具有相同的名称参数和返回类型。

但是,由于 Java5 中存在覆盖,因此超类和子类中的方法不必具有相同的返回类型。这两个方法可以具有不同的返回类型,但是子类中的方法应该返回超类中方法的返回类型的子类型。因此,覆盖方法在返回类型方面会发生变化,这些被称为协变返回类型。

示例

如果您观察以下示例,超类有一个名为 demo() 的方法,它返回 Number 类型的值。子类中的方法可以返回 Integer 类型的值,该类型是 Number 的子类型。此子类型(Integer)称为协变类型

class Super{
   public Number demo(float a, float b) {
      Number result = a+b;
      return result;
   }
}
public class Sub extends Super{
   public Integer demo(float a, float b) {
      return (int) (a+b);
   }
   public static void main(String args[]){
      Sub sub = new Sub();
      System.out.println(sub.demo(25.5f, 89.225f));
   }
}

输出

114

示例

class Example{
   int data =100;
   Example demoMethod(){
      return this;
   }
}
public class Sample extends Test{
   int data =1000;
   Sample demoMethod(){
      return this;
   }
   public static void main(String args[]){
      Sample sam = new Sample();
      System.out.println(sam.demoMethod().data);
   }
}

输出

1000

相关文章