当前位置: 首页 > 知识库问答 >
问题:

当抽象类在Java中实现接口时会发生什么

荆钱明
2023-03-14

我是Java新手,来自C语言背景,我试图理解接口和实现接口的抽象类的概念。当抽象类实现接口时,会发生什么?这是否像继承一样工作,即所有接口方法都属于abtract类,即使它们没有在其中实现?还是只有实现的方法属于抽象类?那么,除了一个用于实现接口,另一个用于继承之外,实现和扩展之间有什么区别吗?

共有3个答案

左丘善
2023-03-14

在Java中,一个类只能从一个类继承,但可以实现多个接口。

抽象类与接口非常相似。主要区别在于抽象类已经可以定义某些函数,而接口不能(注意,在Java9中这一点发生了变化)。

用哪一个?这取决于你的结构,但是javadoc定义了一些例子。

王杰
2023-03-14

方法当然属于实现类。我不会说它来自哪里并不重要,因为多态性。在Java中,您没有多重继承,但可以实现多个接口,因此这为您提供了更多关于层次结构的选项。

景宏富
2023-03-14

你可以把一个抽象类想象成一个未完成的类。这就像是一个实际类的模板Interfaces主要用于描述属性,如CanWalkIsCloseableHasAName等。

从语言的角度来看,这两个概念之间没有太大的区别,只是您只能从一个类进行扩展,但可以实现多个接口。

在继承链的最后,你总是会有非抽象的具体类。很明显,你最终不能使用未完成的类,你需要完成它们。这就是为什么

Animal animal = new Animal();

如果动物抽象的,则不起作用。我们需要创建完成类的实例,比如从动物扩展而来的

在这一点上,当你有一个完成的(非抽象的)类时,所有的抽象方法都需要实现。不管这些方法来自哪里,抽象类或接口,它们都需要实现。

因此,如果您有一个抽象类并用它实现一个接口,那么对于接口方法有两个选项。你也是

  • 在抽象类或

假设我们有一个像

public interface CanMakeNoise {
    void makeNoise();
}

还有抽象类

public abstract class Animal implements CanMakeNoise {
    public abstract void jump();

    ...
}

再加上一个具体的延伸班

public class Dog extends Animal {
    ...
}

因为Dog不是抽象的,所以所有的方法都需要实现。也就是说,我们需要实现jumpmakeNoise。对于makeNoise方法,我们有两个选项,要么Animal实现它,要么让它抽象,然后Dog需要实现它:

// Variant 1
public abstract class Animal implements CanMakeNoise {
    public abstract void jump();

    @Override
    public void makeNoise() {
        System.out.println("hello, what's up");
    }
}

// Variant 2
public abstract class Animal implements CanMakeNoise {
    public abstract void jump();
}

public class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Wuff wuff");
    }
}

当然,需要实现跳跃

public class Dog extends Animal {
    @Override
    public void jump() {
        System.out.println("Boing");
    }

    ...
}

在这种情况下,最好将makeNoise的实现留给更具体的类,因为Animal不知道特定动物的发音。

扩展这个例子,如果你有更具体的类,比如Chihuahua extensed Dog,你可以在Dog中实现makeNoise,因为所有的狗都会“Wuff,Wuff”

 类似资料:
  • 我有两个方法和抽象类的接口,它们实现了这个接口并从它重写了一个方法。我可以实例这个抽象类,而不重写接口的其他方法吗?或者我可以用具有另一个签名的方法替换此方法吗? UPD:谢谢你的回答,我真的在我的问题上犯了错误。我是否可以使用匿名类来扩展我的抽象类,而不重写来自实现的所有方法?我如何理解DragonK的回答,不,我需要创建类,这将是扩展抽象类和重写其他方法?

  • 问题内容: 为什么Java中的许多Collection类都扩展Abstract类并实现接口(也由给定的Abstract类实现)? 例如,class t扩展了并且也实现了,但是已经实现了。 问题答案: 这是记住此类真正实现该接口的一种方式。 它不会有任何不良影响,并且可以帮助您理解代码,而无需遍历给定类的完整层次结构。

  • 我正在运行以下java版本 openjdk版本“10.0.1”2018-04-17 openjdk运行时环境(构建10.0.1 10-Ubuntu-3ubuntu1) openjdk 64位服务器虚拟机(构建10.0.1 10-Ubuntu-3ubuntu1,混合模式) 程序1 输入:deep(master*)JavaStuffs$javac示例。java deep(master*)JavaStu

  • 问题内容: 为什么要创建抽象或接口类,或者何时应使用抽象或接口类? 问题答案: 仅在声明类必须具有的方法和成员时,才使用接口。实现该接口的任何人都必须声明和实现该接口列出的方法。 如果你还想拥有默认实现,请使用抽象类。扩展抽象类的任何类都必须仅实现其抽象方法和成员,并且将具有抽象类其他方法的一些默认实现,你可以覆盖或不重写。 -编辑-忘了提,Earwicker提醒我 最后,你可以根据需要实现任意数

  • 问题内容: 在面试中,有人问我以下问题。我试图回答这个问题,但是我想确切回答这个问题。 如果我可以将Abstract类模拟为Interface,为什么Java提供了Interface? 这意味着如果在Abstract类中我可以将所有方法标记为abstract,然后abstract类将用作接口,那么为什么我需要接口。 谁能简单地解释一下我。 问题答案: 这是一个非常标准的面试问题。答案是:因为您可以