我看过一本书,它说我可以覆盖的方法,如果它具有相同的签名。 按照书上的方法的签名是METHOD_NAME +参数传递。
按照这本书,我可以覆盖具有不同的返回类型的方法。 它实际上是可以覆盖在Java不同的返回类型的方法? 因为我已经做了在网上一搜索一些我发现人们说覆盖的返回类型应该是相同的,以及方法。
按照书上也说,当我们试图自签名意味着只有方法名称和参数超载使用同样的方法名称和参数,但返回类型不同的方法在Java将抛出一个编译错误。 如果这是真的,我们应该能够覆盖不同的返回类型的方法。
请帮我理解这一点。 提前致谢。
您可以返回不同的类型,只要它与被覆盖方法的返回类型兼容。 支持的手段:这是一个子类,子接口,或实施重载的方法返回的类或接口。
这是符合逻辑的。 如果一个方法返回一个动物,你的派生类返回一头牛,你不破坏超类方法的合同,因为牛是动物。 如果派生类返回一个香蕉,这是不正确的了,因为香蕉是不是动物。
你的父类已经作出的承诺,到外面的世界。 例如,该方法:
public Price calculatePrice(Items[] items)
。
它告诉世界期待一个价格。
如果您提高你的子类,它的功能,你仍然要保持你的父类原来的承诺吧。
您可以添加计算的重载方法:
public Price calculatePrice(Items[] items, Integer minimumCharge)
你甚至可以通过使用更具体的返回类型改善你父母的承诺:
public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge)
但你至少要回到你的父母承诺的类型。 这同样适用于在方法声明过的异常。
是的,这是可能的,因为Java 5的,它被称为协变返回类型。 返回类型应该是超类方法返回类型的subcass(原始类型是不允许的)。 例
class X implements Cloneable {
@Override
protected X clone() {
try {
return (X) super.clone();
} catch (CloneNotSupportedException e) {
throw new Error(e); // can never happen
}
}
}
下面是一个例子:
class Base {
public Number test() {
return 0;
}
}
class A extends Base {
public Long test() {
return 1L;
}
}
您的覆盖方法可以有相同类型或子类型将其称作协变回原来的返回类型。
如果你改变了覆盖方法的返回类型别的东西是没有一分型原始类型的,那么你就会得到一个编译时错误。
Yes we can override different return types but they should be subclass.
public class Shape {
public Shape area(Integer i) {
System.out.println("Sape Area");
System.out.println("Integer");
return null;
}
}
package com.oops;
public class Circle extends Shape {
public Circle area(Integer i) {
System.out.println("Circle Area");
System.out.println("int");
return null;
}
}
// Covariant Overriding
public class Parent {
public Parent(){}
String parentName;
public Parent(String parentName){
this.parentName=parentName;
System.out.println(this.parentName);
}
public Parent show(){
return new Parent("Parent");
}
}
public class Child extends Parent{
public Child(){}
String name;
public Child(String name){
this.name=name;
System.out.println(this.name);
}
public Child show(){
return new Child("Child");
}
}
public class Main {
public static void main(String[] args) {
Parent parent=new Child();
parent.show();
Parent parent1=new Parent();
parent1.show();
}
}