我理解的动态加载机制就是在需要的时候继续加载,举个简单的例子:
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("--------");
People p = new People ();
Pet pt = new Pet();
}
}
用cmd命令Javac test1.Java先编译生成.class文件
再通过Java -version test1可以看出所有被加载的类文件
标红的部分是在代码里创建了People和Pet对象,所以被加载。
假设只声明不实例化一个对象呢?
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("--------");
People p = new People ();
//Pet pt = new Pet();
Pet pt;
}
}
并没有加载Pet类。
说明只有类被实例化才华加载。
另外在这个例子中看一下static语句块与static方法在加载时的区别
public class Pet {
static {
System.out.println("原来如此");
}
public static void show(){
System.out.println("show");
}
}
依然看第一张图片,控制台只输出了“原来如此”,说明只执行了静态块语句。刚开始我误以为只要是静态的就该被执行,
现在看来两者是有区别的,静态块语句是类被加载时执行,是主动的;而静态方法是调用时才执行,是被动的。
那么静态方法(调用可以不创建对象,直接通过类名.静态方法名调用)和非静态方法(必须创建对象再调用)都是调用时才会执行,
那么效率一样吗?为什么在我所接触的项目中,大多数方法都是用非静态方法呢?自己还要去研究下。