0

只是扩展问题..

抽象类和接口中的相同方法

假设一个类实现了一个接口并扩展了一个抽象类,并且两者都具有相同的方法(名称+签名),但返回类型不同。现在,当我重写该方法时,它仅在我使返回类型与接口声明的返回类型相同时编译。

另外,如果方法在抽象类或接口中声明为私有或最终会发生什么?

**附注。在一次采访中,爱因斯坦先生在这个问题上坚持了很长时间。是否有一个流行的场景是我们这样做还是他只是在炫耀?

4

4 回答 4

2

不,相同的方法名称和参数,但不同的返回类型在 Java 中是不可能的。底层 Java 类型系统无法*确定运行时对方法的调用之间的差异。

(*我相信有人会证明我错了,但无论如何,该解决方案很可能被认为是糟糕的风格。)

关于私有/最终:由于您必须实现这些方法,因此接口方法和抽象方法都不能是最终的。接口方法默认是公共的。抽象方法不能是私有的,因为它必须在实现类中可见,否则您永远无法实现方法实现,因为您的实现类无法“看到”该方法。

于 2013-08-13T07:35:31.657 回答
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[]) {

    }
}
于 2013-08-13T07:15:00.433 回答
1

使用接口,方法默认是抽象和公共的,因此它们不能有任何其他访问说明符并且它们不能是最终的

对于抽象类,抽象方法可以具有除私有之外的任何访问说明符,并且因为它们是抽象的,所以它们不能是最终的

重写时,方法签名必须相同;和协变(声明的返回类型的子类)返回类型是允许的

于 2013-08-13T07:17:33.650 回答
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[])
 {

 }
}
于 2016-06-19T04:38:42.993 回答