Java的靜態載入和動態載入區別
阿新 • • 發佈:2018-12-30
一、首先是說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檔案和成員比靜態的要快一步,而且更有利於拓展,假如拓展別的人群屬性,靜態載入的弊端就馬上呈現了,拓展起來很麻煩。要定義類、方法、還在呼叫的地方增加程式碼。