Java 调用构造函数是否意味着创建对象?
当我们创建扩展抽象类的子类对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数毫无例外地完成运行,也无法保证是否创建了对象?您只能将抽象类构造函数称为具体子类构造函数的一部分。这是可以的,因为抽象类被扩展为具体类,并且它是正在创建的具体类的对象。除非有任何异常,否则抽象类构造函数只能从子类的构造函数中运行(作为第一条语句)。因此,您可以确保每次运行构造函数时,它都处于创建对象的过程中 也就是说,在创建单个对象的过程中,可以调用多个构造函数,例如Java 调用构造函数是否意味着创建对象?,java,constructor,abstract-class,Java,Constructor,Abstract Class,当我们创建扩展抽象类的子类对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数毫无例外地完成运行,也无法保证是否创建了对象?您只能将抽象类构造函数称为具体子类构造函数的一部分。这是可以的,因为抽象类被扩展为具体类,并且它是正在创建的具体类的对象。除非有任何异常,否则抽象类构造函数只能从子类的构造函数中运行(作为第一条语句)。因此,您可以确保每次运行构造函数时,它都处于创建对象的过程中 也就是说,在创建单个对象的过程中,可以调用多个构造函数,例如Su
Subclass()
调用Subclass(String)
,它通过super()
调用AbstractClass
,等等
但是我们知道我们不能创建抽象类的对象
没错,但JVM可以
这是否意味着即使构造函数毫无例外地完成运行,也无法保证是否创建了对象
对象肯定是在内部创建的
调用构造函数是否意味着创建对象
不总是这样。您可以使用super()
和this()
调用构造函数,但它不会实例化对象。(但只会调用构造函数)
这是调用子类的构造函数时流的工作方式:
Subclass==基类+您在子类中添加的附加类
因此,当您通过调用其构造函数来创建子类时,也会调用基类构造函数,以确保(基类的)所有属性都已正确初始化。当您使用
new
调用构造函数时,将创建一个新对象
现在,您可能已经知道,任何子类的每个构造函数,无论是隐式的还是显式的,直接的还是间接的,都从父类调用构造函数(父类反过来从自己的父类调用构造函数,一直到对象)。这称为构造函数链接
但是,上述情况并不意味着要创建多个对象。该对象已在new
调用中创建,所有在该对象上工作的构造函数都已获得分配的区域。因此,构造函数链接不会创建新对象。对new
的一次调用将返回一个对象
因此,这是否意味着即使构造函数完成运行
毫无例外,无法保证对象是否
创造
简单地说,构造函数
不会创建对象。它只是初始化对象的状态。创建对象的是new
操作符。现在,让我们详细了解一下
使用如下语句创建对象时:
new MyClass();
AbstractClass obj = new ConcreteClass();
对象首先由new
操作符创建。在返回对新创建对象的引用作为结果之前,将处理指示的构造函数以初始化新对象
现在考虑“代码>抽象类< /代码>的情况,具体是<代码>子类< /代码>,当您这样做时:
new MyClass();
AbstractClass obj = new ConcreteClass();
new
操作符创建ConcreteClass
的对象,并调用其构造函数初始化所创建对象的状态。在此过程中,抽象类的构造函数也从ConcreteClass
构造函数调用,以初始化抽象类中对象的状态
因此,基本上没有创建AbstractClass
的对象。只是调用它的构造函数来初始化对象的状态
经验教训:
- 对象是由
操作符创建的,而不是通过调用构造函数本身。因此,在调用任何构造函数之前,已经创建了对象new
- 构造函数只是用来初始化所创建对象的状态。它不创建对象本身
- 对象状态也可以包含在抽象超类中
- 因此,调用
构造函数的目的只是完全初始化对象,并且在过程中没有创建对象抽象类
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(); }}
它正在创建对象。
->否,它正在初始化对象。对象已使用new
运算符创建。@RohitJain“这些情况中的每一种都标识了一个特定的构造函数(§8.8),作为类实例创建过程的一部分,将使用指定的参数(可能没有参数)调用。”()@JeffBowman。。JLS在对象创建本身中包含对象的最小化。所以,我们都没有错。任命:)请注意,在调用构造函数之前,对象已经完全创建。@Rohit:我的意思是对象在这个时间点上是半成品/半初始化:)我希望这是正确的?@NiranjanBhat。。嗯。现在很好。注意:-调用构造函数永远不会创建对象。我