一、类的生命周期
从图中我们可以看到创建对象包括了初始化和使用两个阶段。这两个阶段是接下来的重点讲解。
二、基本知识
创建一个对象的过程包含类的初始化和实例化。
在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。
实例化时候,java虚拟机就会为其分配内存来存放自己及其从父类继承过来的实例变量。在为这些实例变量分配内存的同时,这些实例变量先会被赋予默认值(零值)。在内存分配完成之后,Java虚拟机才会对新创建的对象赋予我们程序员给定的值。
小结
①类构造器完成类初始化(分配内存、赋予默认值)
②类实例化(赋予程序员给定的值)
三、类初始化
在一个类中往往包含静态变量、静态代码块、普通变量、普通方法、构造方法等...
接下来我们一起探讨下类是如何初始化的。
public class InitClass {
public static String staticField = "静态变量";
public String field = "普通变量";
static {
System.out.println("静态初始化块");
System.out.println("staticField="+staticField);
System.out.println("=============分隔符================");
}
{
System.out.println("初始化块");
System.out.println("field="+field);
System.out.println("=============分隔符================");
}
public InitClass(){
System.out.println("构造器");
System.out.println("=============分隔符================");
}
public static void main(String[] args) {
new InitClass();
}
}
执行结果
可以看出执行顺序为 静态初始化块->静态变量->初始化块->普通变量->构造器
重点,面试题必考!)
//父类
public class FatherClass {
public static String parent_staticField = "父静态变量";
public String parent_field = "父普通变量";
static {
System.out.println("父静态初始化块");
System.out.println(parent_staticField);
System.out.println("=============分隔符================");
}
{
System.out.println("父初始化块");
System.out.println(parent_field);
System.out.println("=============分隔符================");
}
public FatherClass(){
System.out.println("父构造器");
System.out.println("=============分隔符================");
}
}
//子类
public class SubSonClass extends FatherClass{
public static String son_staticField = "子静态变量";
public String son_field = "子普通变量";
static {
System.out.println("子静态初始化块");
System.out.println(son_staticField);
System.out.println("=============分隔符================");
}
{
System.out.println("子初始化块");
System.out.println(son_field);
System.out.println("=============分隔符================");
}
public SubSonClass(){
System.out.println("子构造器");
System.out.println("=============分隔符================");
}
public static void main(String[] args) {
System.out.println("子类--------main方法");
new SubSonClass();
}
}
执行结果
可以看出执行顺序为 父静态初始化块->父静态变量->子静态初始化块->子静态变量->父初始化块->父普通变量->父构造器->子初始化块->子普通变量->子构造器
四、创建对象的方式
对象的初始化是在创建对象的时候由jvm完成。对于创建对象,则主要是了解创建对象的几种方式。
1.使用new关键字
2.Class对象的newInstance()方法
3.构造函数对象的newInstance()方法
4.对象的反序列化
5.Object对象的clone()方法
1.使用new关键字
Student s = new Student();
2.Class对象的newInstance()方法
public class ClassNewInstance {
public static void main(String[] args) throws Exception{
String className = "com.chy.jvm.day2.ClassNewInstance";
Class<?> clasz = Class.forName(className);
ClassNewInstance o = (ClassNewInstance)clasz.newInstance();
}
}
3.构造函数对象的newInstance()方法
public class ConstructorNewInstance {
public static void main(String[] args) {
Constructor<ConstructorNewInstance> constructor;
try {
constructor = ConstructorNewInstance.class.getConstructor();
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
4.对象的反序列化
对Java Serializable(序列化)的理解和总结_博客-CSDN博客
5.Object对象的clone()方法
public class ObjectClone {
public static void main(String[] args) throws Exception{
Test initObj = new Test("杜小月");
Test cloneObj = (Test)initObj.clone();
System.out.println(cloneObj.getName());
}
}
//需实现Cloneable接口,并重写clone方法才能正常执行
public class Test implements Cloneable{
private String name;
public Test(){
}
public Test(String name){
this.name = name;
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}