您的位置:首页 > 编程语言 > Java开发

Java的静态加载和动态加载区别

2017-04-05 23:28 267 查看
一、首先是说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文件和成员比静态的要快一步,而且更有利于拓展,假如拓展别的人群属性,静态加载的弊端就马上呈现了,拓展起来很麻烦。要定义类、方法、还在调用的地方增加代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java