2016-03-06 77 views
0

我是Java的新手,所以我正在阅读Java Head First。我已经看到,当你有一个具有抽象方法的抽象类时,你应该在一个具体类中重写这些抽象方法,这意味着“在你的类中使用相同的方法签名(名称和参数)创建一个非抽象方法并返回与抽象方法的声明返回类型兼容的类型“。这意味着什么“返回一个兼容的类型”?

我可以清楚地知道,第一部分关于具有相同签名(名称和参数),但我想有大约返回类型,它是用抽象方法的声明的返回类型兼容的明确的解释。

什么意思是一种兼容的类型?有人可以提供一个例子吗?它是否像返回类型应该是抽象方法中定义的返回类型的类或子类?

回答

1

考虑下面的例子。抽象函数model()的返回类型为int

abstract class Bike{ 
    abstract int model(); 
} 
  • 当重新定义它扩展了抽象类Bike一个具体的类此方法。具体类应该有一个方法model()具有相同的方法签名和兼容的返回类型。

一个返回类型与其他兼容,如果它不会导致的精度损失 。

int兼容的一种返回类型是long

class Honda4 extends Bike{ 
    long model() 
    //long is compatible with int since there is no loss of precision 
    { 
     return 1234; 
    } 

    public static void main(String args[]){ 
     Bike obj = new Honda4(); 
     System.out.println(obj.model()); 
    } 

} 

你能说出一个返回类型是不兼容int

  • short。这可能会导致精确度的降低。
+1

我认为你的解释更清楚,因为你使用的代码简化了理解。谢谢@Matews Mathai – lmiguelvargasf

+0

我的荣幸。快乐学习:) –

+0

Head First Java是一本很棒的书。完整阅读。它把我变成今天的我。整个头部系列是好的。 –

3

重写方法返回的类型必须相同,或者必须是在base方法中返回的类型的子类或子接口。

总之:它必须尊重基本方法的合同。如果基本方法说:“我返回一个水果”,那么重写方法可以说“我返回一个水果”,但它也可以说“我返回一个香蕉”。

这很好,因为香蕉是一种水果。任何人调用方法并获得香蕉都很高兴:预计会有水果,并会收到水果。

虽然回车是不正确的,因为当你要求水果时,获得一辆车是不可接受的。

这个技术术语是covariant return type。请注意,即使基类/方法不是抽象的,该规则也是如此。

+0

非常感谢您的解释。我正在考虑这一点,但我还没有深入了解子接口。 – lmiguelvargasf

3

如果您的返回类型为A,那么您还可以返回从A派生的任何类B的对象。所有这些都是兼容的类型。

您的返回类型也可以是一个接口。在这种情况下,您可以返回任何实现此接口的对象

1

这意味着你的抽象方法必须返回相同或推导类的抽象类 示例中定义的对象的实现: 你有一个抽象类与抽象方法

abstract class AbstractTest{ 
    abstract Date getInitialTime(); 
} 

那么你有一个测试班。

class Test extends AbstractTest{ 

... 
    Date getInitialTime(){ 
     return new Date(); 
    } 
} 

你重写getInitialTime方法和方法的返回如果返回别的东西必须是类日或该

超类的一个对象,那么你就打破之间的合同是什么你的类的方法返回以及父类返回的方法是什么...

+0

感谢您添加代码。 – lmiguelvargasf