一、首先是说java的静态加载:
1.创建了几个类,“老师”、“学生”、“职员”,每个人群有个属性方法,代码如下:
public class Student {
public void belongNature() {
System.out.println("student 在读书……");
}
}
另外的两个类就不列举了,差不多的意思。
2.在main中引用,代码如下:
public class JingLoad {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println("请输入人群,获取属性……");
while(true){
String action=sc.nextLine();
if("exit".equals(action)){
return;
}
if(action.length()>0){
run(action);
}
}
}
static void run(String action){
switch (action) {
case "Officer":
// Officer的静态加载,先编译,在加载其class文件
//这就是静态加载,编译后加载方法,各成员到方法区,堆栈中去
Officer officer=new Officer();
officer.belongNature();
break;
case "Student":
Student student=new Student();
student.belongNature();
break;
case "Teacher":
Teacher teacher=new Teacher();
teacher.belongNature();
break;
default:
break;
}
}
}
运行后,控制台的输入输出如下图:
接下来说动态加载
1.首先定义一个接口,接口代码如下:
public interface attribute {
abstract void belongNature();
}
2.让原先的每个类都实现这个接口,实现接口后类代码如下:
public class Student implements attribute {
@Override
public void belongNature() {
System.out.println("student 在读书……");
}
}
3.原先main中的run方法修改后如下:
package load_kind;
import java.util.Scanner;
public class JingLoad {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println("请输入人群,获取属性……");
while(true){
String action=sc.nextLine();
if("exit".equals(action)){
return;
}
if(action.length()>0){
run(action);
}
}
}
static void run(String action){
try{
//开始实现静态加载
Class clazz=Class.forName("load_kind."+action);
//如下多态像是面向接口编程
attribute instance=(attribute)clazz.newInstance();
instance.belongNature();
}catch(Exception e){
e.printStackTrace();
}
最后控制台的运行效果和之前的一样,如下图
总结:
动态加载编译的class文件和成员比静态的要快一步,而且更有利于拓展,假如拓展别的人群属性,静态加载的弊端就马上呈现了,拓展起来很麻烦。要定义类、方法、还在调用的地方增加代码。