我理解的动态加载机制就是在须要的时候继续加载,举个简单的例子:spa
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文件code
再经过Java -version test1能够看出全部被加载的类文件对象
标红的部分是在代码里建立了People和Pet对象,因此被加载。blog
假设只声明不实例化一个对象呢?图片
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类。cmd
说明只有类被实例化才华加载。io
另外在这个例子中看一下static语句块与static方法在加载时的区别编译
public class Pet { static { System.out.println("原来如此"); } public static void show(){ System.out.println("show"); } }
依然看第一张图片,控制台只输出了“原来如此”,说明只执行了静态块语句。刚开始我误觉得只要是静态的就该被执行,class
如今看来二者是有区别的,静态块语句是类被加载时执行,是主动的;而静态方法是调用时才执行,是被动的。test
那么静态方法(调用能够不建立对象,直接经过类名.静态方法名调用)和非静态方法(必须建立对象再调用)都是调用时才会执行,
那么效率同样吗?为何在我所接触的项目中,大多数方法都是用非静态方法呢?本身还要去研究下。