我了解:
但是从编译器的角度来看,Java为什么要强制执行这些规则?
这不是技术限制,而是(如您所指出的)逻辑上的限制。 Java(和许多其他语言)执行各种规则不是因为它们不可能被破坏,而是因为这是该语言的有意组成部分。
抽象类不完整!作者将其标记为抽象,以告诉您某些代码中缺少实现。作者已经完成了一些工作,但是您必须自己填写一些内容才能使它工作。 abstract
关键字可确保不会有人意外启动此不完整的类。
想修理汽车。有人卸下了刹车片,并在第二天将其更换。现在,为防止有人不小心驾驶此车(未安装制动器),机修工在方向盘上安装了锁。这是一种故障安全措施。
rocketboy显示了一些机械上的原因,但是有一个概念上的原因。
抽象类代表一个抽象概念。以您的车辆为例。您不能制造没有更具体说明的车辆。您可以拥有一组车辆,这些车辆可以由2004卡罗拉和'98福特伴游和1984 CS36(一种游艇),标记为4的萤火虫级中型散装运输车(带有稳定器的车辆)制成。单独把其中任何一辆称为车辆,但您不能拥有仅是一辆车辆,而不是其中一辆或某些其他特定类型的车辆。
抽象类代表诸如车辆之类的抽象概念。因此,实例化一个实例是没有意义的,因为要实际实例化它,您需要知道要实例化的内容。
不能使用new运算符实例化抽象类。因为摘要可能具有抽象方法,即没有任何主体(或实现)的方法。 因为对象不能具有抽象方法,并且JVM无法分配抽象方法的内存
因为抽象类是骨架结构(如果可能的话,它是不完整的构造),因此是术语抽象。
abstract class Person(){
abstract void Speak();
}
表示每个Person
必须讲话。这意味着每个人都应该知道该怎么说(实施speak()
)。 new Person()
不能拥有它,因此是不允许的。
您无法实例化接口或抽象类,因为它会违背面向对象的模型。 Read more
据我了解,抽象类可能包含抽象(没有实现的空)方法。如果我们实例化一个对象并调用empty方法,它将无法正常工作并可能导致问题,因此编译器将强制执行此RULE。任何进一步的观察者?
摘要自我告诉:存在于思想或思想中,但没有物理或具体的存在。在java术语中,抽象关键字定义,如果abstract在类名之前出现,则JDK告知JVM放弃该类对象的启动。没错,抽象类可以有多个构造函数,但只能用于构造函数链接。
您不能实例化抽象类,因为它只是给您的类提供一个扩展它的结构。
并且如果您想开始上课,那么为什么要将其定义为抽象?
非常简单的原因,jvm的使用限制了我们实例化抽象类和接口。
假设编译器允许我们实例化两个确定。
因此,假设我的抽象类包含5个抽象方法,则意味着仅方法原型没有方法主体。
据我们所知,每个方法调用都会在jvm Java堆栈区域中创建一个单独的堆栈内存分配基于方法结构而发生执行后,该堆栈将被破坏。
因此,如果我的方法不包含任何主体,则意味着jvm如何预测内存以分配该方法
第二,如果没有主体意味着没有方法执行,那么它永远也不会从您的Java堆栈区域中消失,您可能会遇到memoryout错误。
因此,考虑这两种情况的编译器限制了我们实例化接口和抽象类
因为Java限制了它,所以我们不能实例化抽象类。因为在一般情况下,抽象意味着不完整,所以我们不能使不完整的事物成为对象。我们必须在具体类中提供抽象类的完整实现。但是我们不能创建抽象类的对象。
因为抽象类是一个不完整的类(从某种意义上说,它是不完整的,它包含没有主体和输出的抽象方法),所以我们无法创建实例或对象;就像您说的一样。
您可以实例化一个抽象类。您只需要提供一个具体的子类。
在Java中,除少数情况外,所有内容都表示为一个对象。当您要实例化类(蓝图)时,必须知道类成员变量,成员方法和构造函数的确切大小。由于某些/所有方法都是抽象的,因此JVM不知道其大小。因此分配内存是无用的。
但是如果我们将内存分配部分从JVM中移走,并将此所有权分配给USER,我们可以实现一些解决此问题的方法。>
实际上,您可以-但仅当您实现已声明为抽象或被遗漏的任何方法时。
Java不允许实例化抽象类的原因是合乎逻辑的。我们没有给出方法的定义,因此,如果它允许创建对象,则没有返回地址可以从堆栈中弹出函数,因此我们陷入了困境。因此,其逻辑上仅不允许对象实例化。