当我们创建扩展抽象类的Subclass对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗?
因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗?
简而言之,a constructor
不会创建对象。它只是 初始化 对象的 状态 。new
创建对象的是操作员。现在,让我们详细了解一下。
当使用如下语句创建对象时:
new MyClass();
该对象首先由new
操作员创建。在返回对新创建对象的引用作为结果之前,处理了所指示的构造函数以初始化新对象。
现在,当您这样做时,请考虑Abstract class
和具体的情况SubClass
:
AbstractClass obj = new ConcreteClass();
new
运算符创建一个对象ConcreteClass
,并调用其构造函数以初始化创建对象的状态。在此过程中,还从ConcreteClass
构造函数中调用抽象类的构造函数,以初始化抽象类中对象的状态。
因此,基本上AbstractClass
不创建对象。只是它的构造函数被调用来初始化对象的状态。
得到教训:
该对象是由new
运算符创建的,而不是由构造函数本身的调用创建的。 因此,在 调用 任何构造函数之前已经创建 了对象。
构造函数仅用于初始化创建对象的状态。它本身不会创建对象。
对象状态也可以包含在抽象超类中。
因此,调用Abstract class
构造函数的目的仅仅是完全初始化对象,而不会在过程中创建任何对象。
看到:
我学到了两件事: -操作符创建一个新实例,然后执行声明的connstuctor来初始化该新实例 根据我的理解,这些说法互相反对。 例如,不会创建两个实例,因为-操作符创建一个实例,构造函数调用并创建另一个实例?当然不会,但现在到底是什么创建了一个实例。。。?
问题内容: 在Java中,数组是AN对象。我的问题是…创建新数组时是否调用了Object构造函数?我们希望利用这一事实来为Object构造函数提供一些额外的字节码,以检查所构造数组的长度。那行得通吗? 问题答案: 就Java语言规范而言,尽管它们都使用关键字,但类实例创建表达式和数组创建表达式是不同的表达式形式,每种都有自己的规则。数组创建表达式的描述未提及调用构造函数。
据我所知,<code>override</code>关键字声明给定的声明实现了一个基本<code>virtual</code>方法,如果没有找到匹配的基本方法,编译应该失败。 我对< code>final关键字的理解是,它告诉编译器任何类都不能覆盖这个< code >虚拟函数。 那么是多余的吗?它似乎编译得很好。最终传达哪些信息而信息不传达?这种组合的用例是什么?
如果这听起来像是一个非常愚蠢的问题,我很抱歉,但这在《飞镖与颤栗》中是一个全新的问题。在颤振示例中,我经常看到这样的构造函数: 我知道什么{}是MAP或SET。但是{}在这里到底是什么意思?为什么它只用于传达一个值Key键? 提前谢谢
我正在从一个教程中重构下面的代码。当我< s >运行编译它时,我得到以下错误: Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型;必需:java.lang.找到字符串:无参数原因:实际参数列表和正式参数列表长度不同 我的理解是,发生这个错误是因为父类Vierbeiner有一个需要字符串参数的构造函数,而没有一个不需要参数的构造函数。我不明白的是,为什么我在没有创建Hund类
问题内容: 我正在尝试修复我的一个程序中的错误,我认为这可能是由于Hibernate弄清楚了如何在不调用其默认(或任何其他)构造函数的情况下实例化对象的实例。 问题答案: 实际上,是的,如果使用objenesis为您实例化对象,则可以在实例化对象时绕过构造函数。它执行字节码操作来实现此目的。 反序列化对象也将绕过构造函数。 使用反射无法做到这一点。