Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类和所有抽象方法和接口之间有什么区别(技术上没有区别)_Java_Oop_Types_Interface_Abstract Class - Fatal编程技术网

Java 抽象类和所有抽象方法和接口之间有什么区别(技术上没有区别)

Java 抽象类和所有抽象方法和接口之间有什么区别(技术上没有区别),java,oop,types,interface,abstract-class,Java,Oop,Types,Interface,Abstract Class,我一直在想他们之间有什么区别?是否只有这样:抽象类声明对象是什么,接口声明对象可以做什么?还是有更深刻的东西?谢谢。它是否可以有字段,它是否可以有构造函数,这些方法是否可以被保护/包private/private,子类型是否可以从其他抽象类/接口继承…这就涵盖了它。它是否可以有字段,它是否可以有构造函数,这些方法中的任何一个是否可以被保护/包private/private,子类型是否可以从其他抽象类/接口继承……这就涵盖了它。在Java中,没有纯抽象类。只声明抽象方法的类也有具体方法,因为它是具

我一直在想他们之间有什么区别?是否只有这样:抽象类声明对象是什么,接口声明对象可以做什么?还是有更深刻的东西?谢谢。

它是否可以有字段,它是否可以有构造函数,这些方法是否可以被保护/包private/private,子类型是否可以从其他抽象类/接口继承…这就涵盖了它。

它是否可以有字段,它是否可以有构造函数,这些方法中的任何一个是否可以被保护/包private/private,子类型是否可以从其他抽象类/接口继承……这就涵盖了它。

在Java中,没有纯抽象类。只声明抽象方法的类也有具体方法,因为它是具体对象类的子类(直接或间接)

接口是定义抽象API的更好选择。Java允许类最多扩展一个类,但实现多个接口

从Java教程中(添加了换行符):

但是,对于抽象类,您可以声明非静态和最终的字段,并定义公共、受保护和私有的具体方法

对于接口,所有字段都自动是公共的、静态的和最终的,并且您声明或定义的所有方法(作为默认方法)都是公共的

此外,您只能扩展一个类,不管它是否抽象,而您可以实现任意数量的接口

本教程还推荐了需要抽象类或接口的情况。它建议在共享代码或非静态、非最终字段或使用公共以外的访问限定符时使用抽象类。通常这些都不适用于纯抽象类


当您希望指定可由多个不相关类实现的API,或希望利用接口类型的多重继承时,它建议使用接口。

在Java中,没有纯抽象类。只声明抽象方法的类也有具体方法,因为它是具体对象类的子类(直接或间接)

接口是定义抽象API的更好选择。Java允许类最多扩展一个类,但实现多个接口

从Java教程中(添加了换行符):

但是,对于抽象类,您可以声明非静态和最终的字段,并定义公共、受保护和私有的具体方法

对于接口,所有字段都自动是公共的、静态的和最终的,并且您声明或定义的所有方法(作为默认方法)都是公共的

此外,您只能扩展一个类,不管它是否抽象,而您可以实现任意数量的接口

本教程还推荐了需要抽象类或接口的情况。换言之,当您想要共享代码或非静态、非最终字段,或使用除public之外的访问限定符时,它建议使用抽象类。通常这些都不适用于纯抽象类

当您想要指定一个可以由多个不相关类实现的API,或者想要利用接口类型的多重继承时,它建议使用接口。

语句“抽象类声明对象是什么”指的是这样一条规则,即如果一个类具有“是”属性,则该类可以从基类继承与基类的关系。因此,
轿车
可能继承自
汽车
,因为
轿车
“是”
汽车
。但这只是故事的一部分。通常,当我们希望抽象基类包含一些限制派生类的功能时,我们定义要从中继承的抽象基类,通常是通过公开不能重写的
final
方法。因此,一个假想的邮件传递抽象基类可能提供一个
公共final prepareAndSend()
方法,该方法按该顺序调用自身上名为
stuffevelope()
lickevelope()
mailevelope()
的抽象重写项。派生类可以重写这些方法,但它无权更改调用它们的顺序,因为
prepareAndSend()
是final。不能对接口施加此类限制

另一方面,接口描述对象可能具有的“功能”或“方面”。一个对象可能有许多不同的功能,因此它可能实现许多接口

注意,“is a”关系似乎可以应用于接口,但它要么只发生在某些人为的例子中,要么是由英语的自由语法造成的错觉;它是不可概括的,在许多情况下它甚至不是事实,这就是为什么没有规则规定对象应该与它实现的每个接口具有“是一个”关系的原因

因此,当然有人可能会制作一个“ICar”界面,这并没有什么错,在这种情况下,不可避免地会有一些东西“是一辆车”,但你更可能看到的是像“IDrivable”、“IInsurable”、“ITaxable”、“IFuelConsumer”等界面。所有这些都描述了特征。事实上,你可以说“汽车是应税的”,这是英语的侥幸;汽车实际上与“应税”没有“是一种”关系,因为“应税”甚至不是一件事。因此,提出“ICar”的人通常只是为了方便将汽车的所有特性组合到一个公共接口中。

语句“抽象类声明对象是什么”指的是这样一条规则,即如果一个类是