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
      操作符创建的,而不是通过调用构造函数本身。因此,在调用任何构造函数之前,已经创建了对象

    • 构造函数只是用来初始化所创建对象的状态。它不创建对象本身

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

    • 因此,调用
      抽象类
      构造函数的目的只是完全初始化对象,并且在过程中没有创建对象
    请参见:


    我完全不同意抽象类的对象不能创建,只有jvm可以在继承的情况下创建,即使程序员可以在任何时候或任何地方使用匿名类的概念进行t次: 看看这段代码,自己试试看

    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。。嗯。现在很好。注意:-调用构造函数永远不会创建对象。我