当我们创建一个类的对象的时候会发生以下事情:类的加载,初始化静态变量,对象的创建。
加载策略:
当我们创建某个对象的时候,加载器会加载其类文件,当加载器注意到该类有其父类,即该类继承自其他类,加载器会继续向上加载其父类,直到找到其祖先。
初始化策略:
当我们加载到根基类之后,根基类的static变量开始初始化,然后是下一个导出类,对其static变量进行初始化,接着以此类推,直到要创建的对象类为止。
对象的创建:
至此为止,必要的类都已经加载完毕,对象就可以开始创建了,首先,对象中的基本类型都会被设为默认值,而对象引用会被设置为null(这是通过对象内存设置为二进制零值而一举生成的),然后,根基类的构造器会被调用,对变量进行初始化,接着会调用导出类的构造器,直到创建对象完成。
对象的销毁:
通过组合和继承方法来创建新类的时候,永远不不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行清理,如果遇到清理的问题,那如果某一个子对象依赖于其他对象,所以销毁的顺序应该与创建的顺序相反,这样当我们销毁某一个对象的时候不必考虑出现异常。
总结起来,对象的创建分为:向上加载,向下初始static,向外构造,向内销毁
类A:
package MainPackage;
/**
* Created by no_clay on 2017/1/17.
*/
public class A{
private static String a = null;
public A() {
System.out.println("Construct A");
}
static {
a = "init a";
System.out.println("The String a init as " + a);
}
}
类B extends 类B:
package MainPackage;
/**
* Created by no_clay on 2017/1/17.
*/
public class B extends A {
private static String b = null;
public B() {
System.out.println("Construct B");
}
static {
b = "init b";
System.out.println("The String b init as " + b);
}
}
类C extends 类B:
package MainPackage;测试类:
/**
* Created by no_clay on 2017/1/17.
*/
public class C extends B {
private static String c = null;
public C() {
System.out.println("Construct C");
}
static {
c = "init c";
System.out.println("The String c init as " + c);
}
}
public class Test {
public static void main(String[] args) {
new C();
}
}
输出结果:
"C:\Program Files\Java\jdk1.8.0_112\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=F:\IntelliJ IDEA Community Edition 2016.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_112\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\rt.jar;D:\ThoughtCode\Java-project\GoForIt\out\production\GoForIt;F:\IntelliJ IDEA Community Edition 2016.3.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain MainPackage.Test
The String a init as init a
The String b init as init b
The String c init as init c
Construct A
Construct B
Construct C
Process finished with exit code 0