我正在学习C ++并且一直在尝试练习面向对象的编程。我使用的很多参考资料都是以Java教程的形式出现的。
我注意到的一件事是,有这样一个抽象类的想法'和'接口'在Java中。我很困惑为什么会有两个这样的。看起来您可以使用接口执行的所有操作都可以与抽象类完全相同。
所以我的问题:接口是否提供Java中的任何其他功能?或者它只是一种指定抽象类不应该允许继承类来实现自己的方法/数据成员的方法吗?
答案 0 :(得分:1)
Java不允许多重继承。这意味着单个子类不能有多个父类。但是,类可以“实现”多个接口。这允许您实现多重继承。
在Java 1.8之前,抽象类和接口之间的主要区别在于,您无法在接口中定义方法,但您可以在抽象类中执行此操作。但Java 8允许在接口本身中实现“默认”和“静态”方法。
至于你的问题,如果你继承了一个抽象类,那么Java会强迫你在子类中实现父类的抽象方法 OR 将子类声明为抽象本身。因此,如果子类继承了一个抽象类,那么子类可以自由地声明和定义它自己的方法和数据成员。它还可以覆盖父抽象类的方法。
接口和抽象类的使用取决于您的需求。但总的来说,最好使用接口。
答案 1 :(得分:0)
是的,Interface是一种特殊的ABC。但为什么java相互区别? 我的理解是
我相信这是一个对象可以继承多个接口但不能有多个超类的原因。
答案 2 :(得分:0)
好。在OOP中,抽象是一个主要概念,在这个概念中,您只需要考虑对您来说很重要的事实,就可以在编程环境中对现实世界进行建模。例如,如果您创建一个Person类,那么您真正需要的是该人的姓名,生日,地址和类似的东西。这是抽象的基本思想。
为什么有两种实现抽象的方法是Java,抽象类和接口。在这种情况下,请考虑一个示例,例如 Bird 类。如果你说要展示一只鸟,你实际会展示的是一只鹦鹉或任何其他特定类型的鸟。虽然我们称它们为鸟类,但除了收集不同类型的鸟类外,没有一种叫做鸟类的东西。在这种情况下, Bird 是一个抽象实体。也就是说,鸟太抽象,无法在现实世界中展示。因此,鸟是一个抽象的类。
当谈到接口时,假设有一个名为 iEat 的接口,其方法为 eat 。如果我们有实施这个界面的Dog,Cat和Parrot课程,他们一般都会吃。但他们吃的方式是特定的课程。因此,当您需要类之间的共同行为时,将使用接口,但实现取决于正在实现的类。
此外,还有一些其他差异,例如可以通过类实现多个接口,但是只能通过类扩展一个抽象类。但主要的想法是。基本上有两种方式,比如抽象类和接口,因为出于设计原因。
答案 3 :(得分:0)
从字面上看,抽象类是一种类,可以继承。抽象类可以包含特定的方法。但是Java中不允许多重继承,即一个类不能继承两个类或类。 但是,接口不是类,而是类的外观,只描述类的行为,因此y不能实例化接口。但是一个类可以实现几个接口。
简而言之
抽象类是整个类的抽象(属性和行为),接口是部分类的抽象(只有行为)
抽象类与其子类之间的关系是"是-a",它们是类似的类。接口与其实现类之间的关系不是特定的关系。
在设计层面。抽象的设计模式是自下而上,即在设计抽象类之前必须先了解子类。但是,在设计界面之前,我们不需要知道任何类的东西。
答案 4 :(得分:0)
实施界面意味着添加功能到您的班级。 抽象类未实现 - 不完整类。
import java.awt.*;
import hsa.Console;
public class Assignment6
{
static Console c;
public static void main (String[] args)
{
Console c = new Console ("Largest Group");
c.println ("Enter a sentence");
String sentence = c.readLine ();
int sentenceGrp = sizeOfLargestGroup (sentence);
c.print (sentenceGrp);
}
private static int sizeOfLargestGroup (String grp)
{
int numGrp = 1;
int grouplength = grp.length ();
int largestcount = 1;
char grpNew = grp.charAt (0);
for (int position = 1 ; position < grouplength ; position++)
{
char grpNew1 = grp.charAt (position);
if (grpNew == grpNew1)
{
numGrp++;
}
else
{
grpNew = grp.charAt (position);
}
}
return numGrp;
}
}