首先创建一个对象,然后执行它的构造函数吗?

Chi*_*hah 10 java oop constructor

我的问题是

A a=new A();
Run Code Online (Sandbox Code Playgroud)

这是首先创建的对象,然后调用构造函数方法?或者创建对象是因为调用了构造函数方法?

如果对象需要调用构造函数,这意味着应该在调用构造函数之前创建对象,如果我将构造函数声明为私有(只是为了查看它是否在没有构造函数的情况下工作),那么我会收到错误.

现在,如果构造函数执行创建了对象,我无法理解逻辑上的工作原理,我的意思是没有对象,对象的方法如何才能执行?

有人可以解释一下吗?

ast*_*eri 12

在调用构造函数之前,为对象分配内存,是.

您可以通过以下步骤来考虑它:

  1. 为对象分配内存.
  2. 执行各种构造函数(总是从层次结构的顶部到最具体Object的构造函数,例如,首先执行构造函数,然后执行其他任何超类,然后执行实际的类).
  3. 所以对象已经有了内存,它正在由构造函数初始化,而不是创建.构造函数只是设置对象的状态.
  4. 在构造函数执行完毕之前,该对象不可用.

实际上,第4点并不完全正确,因为您可以通过传递this给构造函数中的另一个方法来泄漏对该对象的引用,但这有点像边缘情况.这是一种引人入胜的现象,因为您可以final在变量初始化之前访问变量,并从变量中检索两个不同的值,具体取决于它们在执行中的位置.

解决以下注释:构造函数本身不返回任何内容.它有一个void返回类型.变量实际上如何接收对象并不像你想象的那么简单,这是一个非常好的问题.您可以在以下Stack Overflow答案中阅读有关此主题的非常详细的答案,这些答案比我在此处复制的工作做得更好,更彻底.

作为旁注,正如Peter Lawrey在评论中提到的那样,您可以使用Unsafe API来创建对象的实例而无需执行构造函数.然而,根据其他一些Stack Overflow讨论,一般意见似乎是你所做的任何事情Unsafe都不符合普通的Java行为.

  • @PeterLawrey是的,我想到了这一点,但是对于Stack Overflow的其他一些讨论,人们一般都说你不应该认为`不安全'是对语言的有效使用,因为大多数都是`native`代码,这打破了JLS . (2认同)