类的加载过程
1首先执行类中的静态代码块
2初始化静态变量
3最后new一个对象
注意:如果一个类中有静态代码块和非静态代码块
在加载时首先执行静态代码块有多个时则按照放置顺序执行
new对象实例时则会首先执行非静态代码块有多个时则按照顺序执行
加载类和实例的区别
加载类:只是为类的静态成员分配内存并初始化
对象为nullint0char0booleanfalse
new对象则为非静态成员分配内存
packageClassLoader;
//5.5加载类window
classWindow{
Window(){
System.out.println("Window"+"("+")");
}
Window(intmask){
System.out.println("Window"+"("+mask+")");
}
//5.6加载静态代码块加载完毕返回创建对象
{
//代码块在new一个对象时都会执行并且时先执行再调用构造函数
System.out.println("loadclasswindow");
}
}
//5.1加载House类
classHouse{
//5.2初始化成员变量d
staticintd;
booleanad;
Windoww1=newWindow(1);
//5.3按照顺序加载静态代码块并执行其中的方法
static{
System.out.println("first");
}
House(){
System.out.println("House");
//w3=newWindow(33);
}
Windoww2=newWindow(2);
voidf(){
System.out.println("f()");
}
Windoww3=newWindow(3);
static{
//5.4创建对象引起的window类的加载
//5.7加载完毕后调用构造器创建对象
Windowww=newWindow(100);
//5.8继续初始化House类加载完毕返回
System.out.println("ok");
}
}
//类的加载完成两件事一完成对静态成员变量的初始化加载class文件
二执行静态域但不执行静态方法
//调用静态成员静态域引起类加载(加载时会执行static区域内的代码块)
publicclassInitialiedAndNew{
//3.初始化house
staticHousehouse;
//1.运行main方法加载InitialiedAndNew类先执行代码块再按照顺序初始化成员变量
publicstaticvoidmain(String[]args){
//4.执行main方法
//5.调用构造器(静态创建对象首先5.1加载House类
//5.9加载完毕调用构造器创建对象
//Househ=newHouse();
Classcls=Class.forName("ClassLoader.House");
System.out.println("loadsuccessful");
Househ=(House)cls.newInstance();
//6.0执行赋值
House.d=0;
/newHouse();
}
static{
System.out.println("house:");
}
//2.先执行static域代码
static{
System.out.println("loadclassInitialiedAndNew");
System.out.println("houseinitialieis"+house);
}
}