new MyClass();
对象首先由new
运算符创建。在将对新创建的对象的引用作为结果返回之前,处理指定的构造函数以初始化新对象。
Abstract class
和它的具体 SubClass
。AbstractClass obj = new ConcreteClass();
new
运算符创建一个 ConcreteClass
对象,并调用其构造函数来初始化所创建对象的状态。在此过程中,抽象类的构造函数也会从 ConcreteClass
构造函数中调用,以初始化抽象类中对象的状态。
因此,基本上并没有创建 AbstractClass
的对象。只是调用了其构造函数来初始化对象的状态。
学到的教训:
对象是通过 new
运算符创建的,而不是通过构造函数本身的调用创建的。因此,在任何构造函数被调用之前,对象已经被创建了。
构造函数仅用于初始化所创建对象的状态。它本身并不创建对象。
对象状态也可以包含在抽象超类中。
Abstract class
构造函数的目的仅是完全初始化对象,而在此过程中不会创建任何对象。参见:
但我们知道我们无法创建抽象类的对象
是的,但是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.
}
}
new
操作符完成了这个任务。因此,你对第三引用中的论点是错误的。 - Rohit Jain子类 == 基类 + 子类中添加的额外内容
因此,当您通过调用其构造函数创建子类时,也会调用基类构造函数,以确保所有基类属性都得到适当初始化。
我完全不同意抽象类的对象不能被创建,只有在继承的情况下 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(); }}
您只能在 具体子类构造函数的一部分中调用抽象类构造函数。这是可以的,因为抽象类被扩展成具体类,并且正在创建一个该具体类的对象。
当您调用子类的构造函数时,流程如下:
当你使用new
调用构造函数时,会创建一个新的对象。
现在,您可能已经知道,任何子类的构造函数都会隐式或显式地直接或间接地调用父类的构造函数(然后从父类调用其自己的父类,一直到对象)。这称为构造函数链。
然而,上述并不意味着创建了多个对象。对象已经在new
调用时创建,并且所有对该对象进行操作的构造函数已经被分配了一个已分配区域。因此,构造函数链不会创建新对象。一个new
调用将返回一个对象。