当我们创建延伸一个抽象类的子类的对象,抽象类的构造函数也运行。 但我们知道,我们不能创建一个抽象类的对象。 因此,这是否意味着即使一个构造完成后没有任何异常运行,也不能保证一个对象是否创建?
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:
这是当你调用子类的构造函数的流程是如何工作的:
- 抽象类运行的构造函数 - >对象是成功的一半在这里初始化。
- 子类的构造函数执行完毕 - >该目的完全初始化,并因此在这里完全创建。
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(); }}