Java 中接口和抽象类的区别
Mohammad Irfan
2023年1月30日
2021年10月2日
本教程介绍了 Java 中接口和抽象类之间的区别,并列出了一些示例代码来理解该主题。
抽象是隐藏实现并且只向用户提供基本细节的过程。Java 中的抽象是通过抽象类和接口实现的。抽象类和接口有一些共同点,但它们之间有很大的不同。让我们先来看看两者之间的一些相似之处。
抽象类和接口之间的相似之处
- 如上所述,抽象类和接口都用于抽象。
- 抽象类和接口
无法实例化
,即我们无法为它们创建对象。 - 子类必须覆盖抽象类或接口中定义的抽象方法。
以上几点几乎总结了两者之间的相似之处。现在让我们看看它们之间的一些主要区别。
抽象类和接口的区别
抽象类 | 界面 |
---|---|
Java 中的 abstract 关键字用于创建或声明抽象类。 |
在 Java 中,interface 关键字用于创建或声明新接口。 |
类可以通过使用 extends 关键字来继承抽象类的属性和方法。 |
要在 Java 中实现接口,我们可以使用 implements 关键字。 |
抽象类中可以定义抽象或非抽象方法。抽象方法是没有为它们提供任何实现的方法。 | 一个接口中只能有抽象方法。我们只能提供方法定义而不能提供其实现。在 Java 8 之后,我们还可以在接口中使用默认方法和静态方法。 |
抽象类可以在其中包含最终或非最终变量(类属性)。它还可以包含静态或非静态属性。 | 一个接口只能包含静态成员和最终成员,不允许有其他类型的成员。 |
抽象类可以实现接口并实现接口的方法。 | 接口不能扩展任何其他类,也不能覆盖或实现抽象类方法。 |
抽象类可以扩展其他类,也可以实现接口。 | 正如前一点所讨论的,接口不能扩展其他类。但是实现接口没有限制。 |
Java 不支持通过类进行多重继承。抽象类,就像任何其他类一样,不支持多重继承。 | Java 中的多重继承支持是通过接口提供的。这是因为接口提供了完整的抽象。 |
抽象类成员或属性可以是私有的、受保护的或公共的。 | 接口的属性或成员始终是公共的。 |
什么时候使用抽象类和接口
抽象类可以提供部分或完全抽象。另一方面,接口总是提供完整的抽象。可以为一些具有一些共同功能的类创建一个抽象父类。如果你想要更多的行动自由,抽象类也是首选。
当我们想要定义一个基本结构时,接口是首选。然后程序员可以用这个结构构建任何东西。接口还支持多重继承。所以单个类可以实现多个接口。
总的来说,这是一个选择问题和需要完成的任务。抽象类和接口都适用于不同的目的,应该相应地使用。
Java 中的抽象类
让我们创建一个抽象类并创建扩展它的子类以了解抽象类及其功能。
abstract class Bell
{
protected String sound;
Bell()
{
this.sound = "ting";
}
//Abstract Method
abstract public void ring();
//Non-Abstract Methods
public void increaseVolume()
{
System.out.println("Increasing Volume");
}
public void decreaseVolume()
{
System.out.println("Decreasing Volume");
}
}
class SchoolBell extends Bell
{
@Override
public void ring()
{
System.out.println("Ringing the School bell: " + sound);
}
}
class ChruchBell extends Bell
{
@Override
public void ring()
{
System.out.println("Ringing the Chruch Bell: " + sound);
}
}
public class AbstractClassDemo
{
public static void main(String[] args)
{
SchoolBell sb = new SchoolBell();
ChruchBell cb = new ChruchBell();
//Using the overridden methods
sb.ring();
cb.ring();
//Using the non-abstract methods of Bell class
sb.increaseVolume();
cb.decreaseVolume();
}
}
输出:
Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume
Decreasing Volume
Java 中的接口
让我们使用接口复制相同的场景。我们不能再在接口中定义非抽象方法。如果类不想要 increaseVolume()
和 decreaseVolume()
方法的公共实现,接口是正确的选择。
interface Bell
{
String sound = "ting";
//only abstract methods allowed in interface
public void ring();
public void increaseVolume();
public void decreaseVolume();
}
class SchoolBell implements Bell
{
public void ring()
{
System.out.println("Ringing the School bell: " + sound);
}
@Override
public void increaseVolume()
{
System.out.println("Increasing Volume of School Bell");
}
@Override
public void decreaseVolume()
{
System.out.println("Decreasing Volume of School Bell");
}
}
class ChruchBell implements Bell
{
public void ring()
{
System.out.println("Ringing the Chruch Bell: " + sound);
}
@Override
public void increaseVolume()
{
System.out.println("Increasing Volume of Chruch Bell");
}
@Override
public void decreaseVolume()
{
System.out.println("Decreasing Volume of Chruch Bell");
}
}
public class InterfaceDemo
{
public static void main(String[] args)
{
SchoolBell sb = new SchoolBell();
ChruchBell cb = new ChruchBell();
//Using the overridden methods
sb.ring();
cb.ring();
//Using the non-abstract methods of Bell class
sb.increaseVolume();
cb.decreaseVolume();
}
}
输出:
Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume of School Bell
Decreasing Volume of Chruch Bell
实现接口的抽象类
如上一节所述,我们可以在抽象类中实现接口的方法。下面的代码演示了这一点。
interface Bell
{
String sound = "ting";
//only abstract methods allowed in interface
public void ring();
public void increaseVolume();
public void decreaseVolume();
}
abstract class AbstractBell implements Bell
{
public void increaseVolume()
{
System.out.println("Increasing Volume");
}
public void decreaseVolume()
{
System.out.println("Decreasing Volume");
}
}
总结
抽象是面向对象编程中使用的最基本的概念之一。抽象用于隐藏实现,只向用户提供最少的基本细节。在 Java 中,抽象是通过使用抽象类或接口来完成的。两者之间的主要区别是抽象类也可以提供部分抽象,而接口将始终提供完整抽象。在本教程中,我们讨论了两者之间的一些主要区别。