1. 程式人生 > >Java的靜態載入和動態載入區別

Java的靜態載入和動態載入區別

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