1.程序加载的含义
程序加载,就是将类文件中的一行行代码放到内存当中,只是放到,并不去执行。
2.什么时候会加载
(1)new一个对象时
(2)使用类中的静态成员
3.加载顺序与在内存中存放位置
举例子来说下。在main函数中有下面语句:Person p=new Person("zhangsan",20);
(1)在栈内存中,开辟main函数空间,建立main函数的变量p
(2)加载Person.class文件到内存,注意不会加载类中的非静态成员变量。
(3)如果Person类中有静态代码块,先执行静态代码块
(4)在堆内存中开辟空间,分配内存地址
(5)在堆内存中建立对象的特有属性,进行默认初始化
(6)对Person类进行显示初始化
(7)执行Person类中的构造代码块
(8)执行Person类中的构造函数
(9)完成所有初始化,将内存地址赋值给栈中的变量p
还有语句:p.setName("lisi")
(1)在栈内存中开辟setName方法的空间,里面有对象的引用this、临时变量name
(2)将p的值赋值给this,this就指向了堆中p的一些东东
(3)将“lisi”赋值给临时变量name
(4)将临时变量的值赋给this.name
代码实例:
person类:
public class Person {
private String name;
private int age = 0;
private static String country = "CN";
Person(String name,int age){
this.name = name;
this.age = age;
}
static{
System.out.println("Person静态代码块被执行");
}
{
System.out.println(name+"^^^"+age);
}
public void setName(String name){
this.name = name;
}
public void speak(){
System.out.println(this.name+"+++++"+this.age);
}
public static void showCountry(){
System.out.println("country="+country);
}
}
main方法调用:
public class StaticCodeDemo {
static {
System.out.println("StaticDemo静态代码块1");
}
public static void main(String[] args){
Person p=new Person("张三",100);
p.setName("李四");
p.speak();
Person.showCountry();
}
static { //静态代码块
System.out.println("StaticDemo 静态代码块2");
}
}
运行结果:
StaticDemo静态代码块1
StaticDemo 静态代码块2
Person静态代码块被执行
null^^^0
李四+++++100
country=CN
可见加载执行顺序是:静态代码块--->构造代码块--->构造函数