11

当涉及接口时,我一直在尝试理解继承。我想知道如果它们遵循以下子类是如何创建的:

例如,假设我有:

  1. 实现接口 I 的超类
  2. 和几个扩展超类 A 的子类

我的问题

  1. 我是否必须在所有扩展 A 的子类中提供接口方法“q 和 r”的实现?

  2. 如果我不在子类中提供接口的实现,我是否必须使该子类成为抽象类?

  3. 任何子类都可以实现 I 吗?例如 C 类扩展 A 实现 I,这可能吗?即使它已经扩展了实现 I 的超类?

  4. 假设我不提供接口 I 中方法 r 的实现,那么我将不得不创建超类 A 和抽象类!那是对的吗?

我的示例代码:

    //superclass
    public class A implements I{
    x(){System.out.println("superclass x");}
    y(){System.out.println("superclass y");}
    q(){System.out.println("interface method q");}
    r(){System.out.println("interface method r");}
    }

    //Interface
    public Interface I{
    public void q();
    public void r();
    }

    //subclass 1
    public class B extends A{
    //will i have to implement the method q and r?
    x(){System.out.println("called method x in B");}
    y(){System.out.println("called method y in B");}
    }

    //subclass 2
    public class C extends A{
    //will i have to implement the method q and r?
    x(){System.out.println("called method x in C");}
    y(){System.out.println("called method y in C");}
}
4

4 回答 4

8

1)不,您不需要实现子类中的方法,因为它们已经在超类中定义。子类将继承这些方法定义。

2)不,见1。唯一的例外是如果超类是抽象的并且没有实现接口,那么如果子类不是抽象的,则需要在子类中实现它。

3) 不。它可能编译正确,但没有效果,所以不应该这样做。

4) 是的,这是正确的。如果不从接口实现方法,则需要使类抽象。

于 2012-10-30T00:34:21.043 回答
1

只有抽象类才能使它们保持抽象,这意味着抽象类不需要为接口中的方法提供实现。

因为,A是具体的,它必须提供实现。然后 的子类A将仅从A.

但是,如果A是抽象的并且没有提供方法的实现,那么B并且C必须提供实现。

于 2012-10-30T00:36:15.880 回答
1

1:不,如果你在你的超类中实现它们,它不需要在你的子类中实现它们

2:如果你不实现超类中的方法,那么你必须使其抽象,然后让你的具体子类实现这些方法

3:是的,但绝对是多余的,因为你的超类已经在实现 thrm。

4:是的,当你扩展你的超类时,你应该在类中实现这些方法

于 2012-10-30T00:36:58.213 回答
0

接口是对外界的承诺,即“我可以提供这些方法”。

1) 和 2) 和 4) 由于超类 A 已经实现了接口 I,它已经向外界承诺。超类 A 可以通过以下方式实现这一承诺:

  • 实现该方法 - 在这种情况下,您的子类已经继承了该方法并且不需要实现任何东西。
  • 声明自己是抽象的——在这种情况下,您的子类必须要么实现抽象方法,要么也将自己声明为抽象,然后将责任“转嫁”给任何扩展子类的类。

3)超类A的所有子类都实现了I,因为它们继承了“承诺”,所以C类扩展A实现I是多余的。

于 2012-10-30T00:38:13.127 回答