调用构造函数是否意味着创建对象?
当我们创建一个扩展抽象类的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
将返回一个对象。
这是调用子类的构造函数时流的工作方式:
- Abstract类的构造函数运行 – >对象在这里初始化了一半。
- 子类的构造函数完成执行 – >对象完全初始化,因此在这里完全创建。
我完全不同意,无法创建抽象类的对象,只有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(); }}