调用构造函数是否意味着创建对象?

当我们创建一个扩展抽象类的Subclass对象时,抽象类构造函数也会运行。 但我们知道我们不能创建抽象类的对象。 因此,它是否意味着即使构造函数在没有任何exception的情况下完成运行,也无法保证是否创建了对象?

因此,它是否意味着即使构造函数在没有任何exception的情况下完成运行,也无法保证是否创建了对象?

简单来说, constructor函数不会创建对象。 它只是初始化对象的状态 。 它是创建对象的new运算符。 现在,让我们详细了解这一点。

使用如下语句创建对象时:

 new MyClass(); 

该对象首先由new运算符创建。 在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以初始化新对象。


现在考虑一下Abstract class的情况,它是具体的SubClass ,当你这样做时:

 AbstractClass obj = new ConcreteClass(); 

new运算符创建ConcreteClass的对象,并调用其构造函数来初始化创建的对象的状态。 在此过程中,还从ConcreteClass构造函数中调用抽象类的构造函数,以初始化抽象类中对象的状态。

所以,基本上没有创建AbstractClass的对象。 只是它的构造函数被调用来初始化对象的状态。

得到教训:

  • 该对象由new运算符创建,而不是由构造函数本身的调用创建。 因此,在调用任何构造函数之前已经创建了该对象。

  • 构造函数仅用于初始化创建的对象的状态。 它本身不会创建对象。

  • 对象状态也可以包含在抽象超类中。

  • 因此,调用Abstract class构造函数的目的只是为了完全初始化对象,而不是在进程中创建对象。

看到:

  • 创建新的类实例 – JLS-Section#12.5

但我们知道我们无法创建Abstract类的对象

对,但JVM可以。

这是否意味着即使构造函数在没有任何exception的情况下完成运行,也无法保证是否创建了对象?

该对象绝对是内部创建的。

调用构造函数是否意味着创建对象?

不总是。 你可以使用super()this()来调用构造函数,但它不会实例化一个对象。 (但只会调用构造函数)

 class AClass { AClass() { this(1); // will invoke constructor, but no object instatiated. } AClass(int a) { } public static void main(String[] args) { AClass obj = new AClass(); // one object instantiated. } } 

除非出现任何exception,否则抽象类构造函数仅在子类的构造函数中运行(作为第一个语句)。 因此,您可以确保每次运行构造函数时,它都在创建对象的过程中。

也就是说,您可以在创建单个对象的过程中调用多个构造函数,例如Subclass()调用通过super()调用调用AbstractClass Subclass(String) ,依此类推。

Subclass == BaseClass + Extras you add in sub class

因此,当您通过调用其构造函数创建子类时,还会调用基类构造函数,以确保(基类的)所有属性也已正确初始化。

您只能将抽象类构造函数作为具体子类构造函数的一部分来调用。 这是可以的,因为抽象类扩展为具体类 ,它是正在创建的具体类对象

使用new调用构造函数时,将创建一个新对象。

现在,正如您可能已经知道的那样,任何子类的每个构造函数,无论是隐式还是显式,直接或间接地从父类调用构造函数(它依次从其自己的父类调用一个,一直到对象)。 这称为构造函数链接。

但是,上述内容并不意味着创建了多个对象。 该对象已在new调用时创建,并且处理该对象的所有构造函数已经处理了已分配的区域。 因此,构造函数链不会创建新对象。 一次调用new将返回一个对象。

这是调用子类的构造函数时流的工作方式:

  1. Abstract类的构造函数运行 – >对象在这里初始化了一半。
  2. 子类的构造函数完成执行 – >对象完全初始化,因此在这里完全创建。

我完全不同意,无法创建抽象类的对象,只有jvm可以在inheritance的情况下执行它,即使程序员可以通过使用匿名类的概念随时随地执行此操作:看看这段代码并由你自己尝试

 abstract class Amit{ void hai() {System.out.print("Just Wanna say Hai");} abstract void hello(); } class Main{ stic public void main(String[]amit) { Amit aa=new Amit(){ void hello(){Sstem.out.print("I actually dont say hello to everyone"); }}; aa.hello(); }}