初始化类和实例化对象之间的区别?
我试图通过搜索引擎搜索这个问题但是可以找到一个主题来解释初始化类和实例化对象之间的区别。
有人可以解释他们有何不同?
有三个与此主题相关的术语:声明,初始化和实例化。
从后到前工作。
实例化
这是为对象分配内存的时候。 这就是new
关键字正在做的事情。 从new
关键字返回对创建的对象的引用。
初始化
这是将值放入已分配的内存中的时间。 这是使用new
关键字时类的构造函数 。
还必须通过将对内存中某个对象的引用传递给它来初始化变量。
宣言
这是当您向程序声明将存在某种类型的对象以及该对象的名称时。
同一行上的初始化和实例化示例
SomeClass s; // Declaration s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's'
在与内存不同的行上初始化变量的示例
void someFunction(SomeClass other) { SomeClass s; // Declaration s = other; // Initializes the variable 's' but memory for variable other was set somewhere else }
我还强烈建议阅读本文关于Java如何处理传递变量的性质。
当Java类“加载”到JVM中时,必须以多种方式初始化类表示。
- 类的“常量池”被扩展为运行时结构,并初始化其中的一些值。
- 该类的超类(通过常量池)和它的属性被提取。
- 为类的方法构造方法表。 各个方法标记为“尚未validation”。
- 对类表示执行若干validation操作。
- 静态字段已初始化。
- 在第一次引用时,字符串文字被“实例化”,并且实习字符串指针被放置在常量池中
- 在第一个参考方法被“validation”。
- 等。
有一组特定的术语用于引用类初始化,但我不记得具体细节。 某些事情只能在一个类初始化到特定点之后发生,等等。
实例化对象只能在加载和初始化类之后发生(尽管所有方法都不需要validation)。 对象的大小是从类中获取的,并且定位了多个堆并将其归零。 对象头用一个指向类的指针和用于管理类的其他字段填充。 然后调用类的适当构造方法(并且它将调用任何超级构造函数)。
使用静态初始化块完成类的初始化。 (静态的 { })。 它不是一种方法,它是一个初始化器。 它是在第一次引用类本身时执行的。
通过调用其构造函数,例如使用new关键字来实例化对象。 那时静态初始化块将不会被执行。