类的加载和对象构造(实例化)过程
类的加载
1. 什么是类的加载(Node 类加载)
从硬盘上找到Node .class ,解析该文件,生成Node类,把Node类信息存到内存方法区。
2. 什么情况下会触发类的加载
1)按需加载(懒加载)
1.实例化该类的一个对象
2、使用类的静态属性或静态方法
3.用到子类,必须先有父类
3.其他规则
静态属性初始化
按照到吗的书写顺序执行
1.静态属性定义时初始化
2.静态代码块
对象构造
1. 优先初始化父类属性
2.按照下面的顺序初始化
1. 按照代码书写顺序,执行定义时和构造代码块时初始化
2.构造方法初始化
附上代码理解
class Parent2{
{
System.out.println("A");
}
Parent2(){
System.out.println("B");
}
{
System.out.println("C");
}
}
public class instanceOrder extends Parent2{
instanceOrder(){
super();
System.out.println(1);
}
instanceOrder(int v){
this();
System.out.println(2);
}
private int initA(){
System.out.println(3);
return 0;
}
private int initB(){
System.out.println(4);
return 0;
}
int a=initA();
{
System.out.println("5");
}
{
System.out.println("6");
}
public static void main(String[] args){
new instanceOrder(10);
}
}
结果
A
C
B
3
5
6
面试题
知识点:1.静态块优先于构造块执行
2.无论产生多少实例化对象,静态块都执行一次
class HelloA {
//构造方法
public HelloA(){
System.out.println("1Hello A!父类构造方法");
}
//非静态代码块
{
System.out.println("2i'm A class.父类非静态代码块");
}
//静态代码块
static{
System.out.println("3static A 父类静态代码块");
}
}
class HelloB extends HelloA {
//构造方法
public HelloB(){
System.out.println("4Hello B! 构造方法");
}
//非静态代码块
{
System.out.println("5i'm B class.非静态代码块");
}
//静态代码块
static{
System.out.println("6static B 静态代码块");
}
}
public class HelloC {
public static void main(String[] args) {
System.out.println("7---start---");
new HelloB();
new HelloB();
System.out.println("8---end---");
}
}
结果
7---start---
3static A 父类静态代码块
6static B 静态代码块
2i'm A class.父类非静态代码块
1Hello A!父类构造方法
5i'm B class.非静态代码块
4Hello B! 构造方法
2i'm A class.父类非静态代码块
1Hello A!父类构造方法
5i'm B class.非静态代码块
4Hello B! 构造方法
8---end---