只是扩展问题..
Same method in abstract class and interface
假设一个类实现了一个接口并扩展了一个抽象类,并且它们都有相同的方法(名称+签名),但返回类型不同。现在,当我重写方法时,它只在我使返回类型与接口声明的返回类型相同时进行编译。
此外,如果在抽象类或接口中将方法声明为private或final,会发生什么?
**旁注。爱因斯坦先生在接受采访时坚持这个问题的时间非常长。有没有一个流行的场景,我们这样做或他只是炫耀?
答案 0 :(得分:2)
如果抽象类中的方法也是抽象的,则必须在它扩展的第一个具体类中提供它的实现。此外,您还必须提供接口的实现。如果两个方法仅在返回类型上有所不同,则具体类将具有重载方法,这些方法仅在返回类型方面不同。而且我们不能有重载方法,只有返回类型不同,因此错误。
interface io {
public void show();
}
abstract class Demo {
abstract int show();
}
class Test extends Demo implements io {
void show () { //Overloaded method based on return type, Error
}
int show() { //Error
return 1;
}
public static void main (String args[]) {
}
}
答案 1 :(得分:2)
不,Java中不可能使用相同的方法名称和参数,但返回类型不同。底层Java类型系统无法确定运行时对方法的调用之间的差异。
(*我相信有人会证明我错了,但最有可能的解决方案被认为是不好的风格。)
关于private / final:由于必须实现这些方法,因此接口方法和抽象方法都不是最终的。接口方法默认是公共的。抽象方法不能是私有的,因为它必须在实现类中可见,否则你永远无法实现方法实现,因为你的实现类不能“看到”该方法。
答案 2 :(得分:1)
使用Interfaces,默认情况下方法是抽象的和公共的, 所以他们不能有任何其他访问说明符,他们不能是最终的
使用抽象类,抽象方法可以拥有除private之外的任何访问说明符,因为它们是抽象的,它们不能是最终的
在覆盖时,方法签名必须相同;和covariant(声明的返回类型的子类)允许返回类型
答案 3 :(得分:1)
一个类不能实现两个具有相同名称但返回类型不同的方法的接口。它会给编译时错误。 接口内部的方法默认是公共抽象,它们没有任何其他说明符。
interface A
{
public void a();
}
interface B
{
public int a();
}
class C implements A,B
{
public void a() // error
{
//implementation
}
public int a() // error
{
//implementation
}
public static void main(String args[])
{
}
}