Java 继承与接口

Java 继承与接口,java,inheritance,interface,subclass,Java,Inheritance,Interface,Subclass,我一直试图理解涉及接口时的继承。我想知道如果子类遵循以下要求,它们是如何创建的: 例如,假设我有: 实现接口I的超类 和几个扩展超类A的子类 我的问题 我是否必须在扩展A的所有子类中提供接口方法“q和r”的实现 如果我不在一个子类中提供接口的实现,我将不得不使该子类成为一个抽象类吗 子类中的任何一个子类都可以实现I吗?e、 类C扩展了一个I,这可能吗?即使它已经扩展了一个实现I的超类 假设我没有从接口i提供方法r的实现,那么我将不得不将超类设为一个抽象类!对吗 我的示例代码: //sup

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

例如,假设我有:

  • 实现接口I的超类
  • 和几个扩展超类A的子类
  • 我的问题

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

  • 如果我不在一个子类中提供接口的实现,我将不得不使该子类成为一个抽象类吗

  • 子类中的任何一个子类都可以实现I吗?e、 类C扩展了一个I,这可能吗?即使它已经扩展了一个实现I的超类

  • 假设我没有从接口i提供方法r的实现,那么我将不得不将超类设为一个抽象类!对吗

  • 我的示例代码:

        //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");}
    }
    
    1) 不,您不需要在子类中实现方法,因为它们已经在超类中定义。子类将继承这些方法定义

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

    3) 不。它可能会正确编译,但不会产生任何效果,因此不应该这样做


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

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

    因为,
    A
    是具体的,所以它必须提供实现。然后
    A
    的子类将从
    A
    继承这些实现


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

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

    2:如果你在你的超类中实现了方法,那么你必须把它抽象出来,然后让你的具体子类实现这些方法

    3:是的,但绝对是多余的,因为您的超类已经实现了thrm


    4:是的,当扩展你的超类时,你应该在类中实现这些方法。一个接口向外界承诺“我可以提供这些方法。”

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

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

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

    类方法也需要返回类型。感谢您的澄清!我还有一个问题。假设A现在是一个抽象超类,仍然实现接口I,如果我仍然想使用A中的方法(假设接口方法q()),这会对子类产生怎样的影响?抽象类仍然可以提供方法的实现,因此您可以通过子类正常使用它们。因此,如果您在A(而不是B)中定义x(),然后调用B.x()(其中B是类型B的对象),它将使用A中提供的方法定义,就像A不是抽象类一样。谢谢!对于所有回答:)如果我想用超类实现的接口来强制转换一个子类呢?它抛出了一个ClassCastException。我怎样才能做到这一点呢?你能告诉我为什么我要在这种情况下使用抽象类吗?设计明智有什么理由吗?为什么我不能为一个类提供一个接口,为什么中间类中的抽象层次结构是为什么要在这样的场景中引入抽象类的一个很好的例子。主要是,如果接口有太多的方法,那么大多数时候,具体的接口都会对实现感兴趣。但是,如果考虑像[<代码> Runnaby<代码> >这样的接口,只有一种方法,那么创建抽象类就没有意义。此外,如果设计需要在类层次结构中有一些代码可重用性,那么抽象基类将是一种方法。