并调用构造函数是指创建对象?(Does invoking a constructor mean cr

2019-07-18 12:29发布

当我们创建延伸一个抽象类的子类的对象,抽象类的构造函数也运行。 但我们知道,我们不能创建一个抽象类的对象。 因此,这是否意味着即使一个构造完成后没有任何异常运行,也不能保证一个对象是否创建?

Answer 1:

因此,这是否意味着即使一个构造完成后没有任何异常运行,也不能保证一个对象是否创建?

简单地说,一个constructor不创建一个对象。 它只是初始化对象的状态 。 这是new运营商,其创建对象。 现在,让我们明白这一点小细节。

当您使用的语句这样创建对象:

new MyClass();

目的首先是通过建立new运营商。 就在新创建的对象的引用作为返回结果,表明构造处理初始化新对象。


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

AbstractClass obj = new ConcreteClass();

new运营商创建的目的ConcreteClass ,并调用它的构造来初始化创建的对象的状态。 在这个过程中,抽象类的构造也被从被叫ConcreteClass构造函数,以初始化抽象类的对象的状态。

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

得到教训:

  • 目的是通过创建new运营商,而不是通过构造函数本身的调用。 因此,在调用任何构造函数之前已经创建的对象。

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

  • 一个对象的状态,也可以包含在一个抽象的超类。

  • 所以,调用的目的Abstract class的构造函数,只有完全初始化对象,并在过程中没有创建对象。

看到:

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


Answer 2:

但我们知道,我们不能创建一个抽象类的对象

权利,但JVM可以。

它意味着,即使一个构造完成后没有任何异常运行,也不能保证一个对象是否创建?

对象肯定是内部创建。

并调用构造函数是指创建对象?

不总是。 您可以通过调用构造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.
    }
}


Answer 3:

除非任何异常,抽象类的构造函数只从子类的构造函数中运行(如第一个语句)。 因此,你可以肯定的是每一个构造函数运行时,它是在创建对象的过程。

这就是说,你可以调用多个构造函数创建一个对象,如进程Subclass()调用Subclass(String)它调用AbstractClass通过super()调用,等等。



Answer 4:

Subclass == BaseClass + Extras you add in sub class

因此,当您通过调用其构造一个子类,有一个基类的构造函数的调用,以及以确保(基类)的所有属性也正确初始化。



Answer 5:

你只能调用抽象类的构造函数的具体子类的构造函数的一部分 。 这是行,由于抽象类延伸到一个具体的类 ,它是正在创建的具体类的一个对象



Answer 6:

当您使用调用构造new ,正在创建一个新的对象。

现在,你可能已经知道,任何的子类的每一个构造函数,隐式或显式,直接或间接地调用父类(在转弯,调用来自它自己的父类的一个构造函数,一路攀升到对象)。 这就是所谓的构造函数链。

以上,但是并不意味着创建多个对象。 该对象在创建new呼叫,并在该对象上工作的所有构造都已经交给分配的区域。 因此,构造函数链并没有创建新的对象。 一个调用new将返回一个对象。



Answer 7:

这是当你调用子类的构造函数的流程是如何工作的:

  1. 抽象类运行的构造函数 - >对象是成功的一半在这里初始化。
  2. 子类的构造函数执行完毕 - >该目的完全初始化,并因此在这里完全创建。


Answer 8:

我完全不同意,对于抽象类的对象不能被创建,只有JVM可以它在继承的情况下,即使是程序员有时可以做到无论何时何地,他/她打算使用匿名类的概念,这样做:看看这个代码,并通过自己的尝试

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(); }}


文章来源: Does invoking a constructor mean creating object?