我是Java新手,来自C语言背景,我试图理解接口和实现接口的抽象类的概念。当抽象类实现接口时,会发生什么?这是否像继承一样工作,即所有接口方法都属于abtract类,即使它们没有在其中实现?还是只有实现的方法属于抽象类?那么,除了一个用于实现接口,另一个用于继承之外,实现和扩展之间有什么区别吗?
在Java中,一个类只能从一个类继承,但可以实现多个接口。
抽象类与接口非常相似。主要区别在于抽象类已经可以定义某些函数,而接口不能(注意,在Java9中这一点发生了变化)。
用哪一个?这取决于你的结构,但是javadoc定义了一些例子。
方法当然属于实现类。我不会说它来自哪里并不重要,因为多态性。在Java中,您没有多重继承,但可以实现多个接口,因此这为您提供了更多关于层次结构的选项。
你可以把一个抽象类想象成一个未完成的类。这就像是一个实际类的模板
Interface
s主要用于描述属性,如CanWalk
、IsCloseable
、HasAName
等。
从语言的角度来看,这两个概念之间没有太大的区别,只是您只能从一个类进行扩展,但可以实现多个接口。
在继承链的最后,你总是会有非抽象的具体类。很明显,你最终不能使用未完成的类,你需要完成它们。这就是为什么
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
不是抽象的,所以所有的方法都需要实现。也就是说,我们需要实现jump
和makeNoise
。对于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类将用作接口,那么为什么我需要接口。 谁能简单地解释一下我。 问题答案: 这是一个非常标准的面试问题。答案是:因为您可以