① java中類的載入是在什麼時候做的
樓上的負責一點好么,類載入是在編譯的時候?載入一個類需要用到載入器,
你程序都沒運行,jvm都沒啟動,哪來的載入器,你拿什麼去載入一個類?
類載入的時候是運行程序時 它就載入了,至於編譯,你用IDE,是你一保存,它就給編譯好了。
② java重新載入class文件
Java類的載入是動態的,它並不會一次性將所有類全部載入後再運行,而是保證程序運行的基礎類(像是基類)完全載入到jvm中,至於其他類,則在需要的時候才載入。這當然就是為了節省內存開銷。
Java的類載入器有三個,對應Java的三種類:
Bootstrap Loader // 負責載入系統類 (指的是內置類,像是String,對應於C#中的System類和C/C++標准庫中的類)
|
- - ExtClassLoader // 負責載入擴展類(就是繼承類和實現類)
|
- - AppClassLoader // 負責載入應用類(程序員自定義的類)
三個載入器各自完成自己的工作,但它們是如何協調工作呢?哪一個類該由哪個類載入器完成呢?為了解決這個問題,Java採用了委託模型機制。
委託模型機制的工作原理很簡單:當類載入器需要載入類的時候,先請示其Parent(即上一層載入器)在其搜索路徑載入,如果找不到,才在自己的搜索路徑搜索該類。這樣的順序其實就是載入器層次上自頂而下的搜索,因為載入器必須保證基礎類的載入。之所以是這種機制,還有一個安全上的考慮:如果某人將一個惡意的基礎類載入到jvm,委託模型機制會搜索其父類載入器,顯然是不可能找到的,自然就不會將該類載入進來。
我們可以通過這樣的代碼來獲取類載入器:
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();
注意一個很重要的問題,就是Java在邏輯上並不存在BootstrapKLoader的實體!因為它是用C++編寫的,所以列印其內容將會得到null。
前面是對類載入器的簡單介紹,它的原理機制非常簡單,就是下面幾個步驟:
1.裝載:查找和導入class文件;
2.連接:
(1)檢查:檢查載入的class文件數據的正確性;
(2)准備:為類的靜態變數分配存儲空間;
(3)解析:將符號引用轉換成直接引用(這一步是可選的)
3.初始化:初始化靜態變數,靜態代碼塊。
這樣的過程在程序調用類的靜態成員的時候開始執行,所以靜態方法main()才會成為一般程序的入口方法。類的構造器也會引發該動作。
③ Java中類載入出現在哪個階段,編譯期和運行期 類載入和類裝載是一樣的嗎
使用的類,編譯/運行時都會被載入。
載入/裝載沒有區別,翻譯的詞彙選擇因人而異了
運行 javac /java 時 加上 -verbose 選項就可以看到了。
④ Java類的編譯載入
好用啊 沒有錯誤 建議用eclipse或者myeclipse
⑤ 只要正常編譯類文件類就會載入嗎java類到底是什麼時候載入的
除了先把保證程序運行的基礎類一次性載入到jvm別的都是用到了才會載入.好像是這樣,前幾天看的,也沒專心記
⑥ JAVA新手,我的JAVA文件編譯成CLASS文件後用JDK運行顯示找不到或無法載入主類
沒有找到主類,並不是這個名能不能用或者能用的關系。
Java在window的dos下執行java的一些命令;
java 表示執行某一個位元組碼文件
javac 表示編譯某一個java文件
首先確定,你要使用java執行的Saloton是已經編譯過,並且在當前目錄下(或者帶上文件路徑);
其次你需要確定在Saloton中是否存在主程序的入口方法,也就是我們平時所說的
publicstaticvoidmain(String[]args){}
不然他是找不到程序入口
⑦ java 類載入先後順序
1.父類靜態代碼塊;
2.子類靜態代碼塊;
3.父類非靜態代碼塊;
4.父類構造函數;
5.子類非靜態代碼塊;
6.子類構造函數;
舉例:
public class ExA {
static {
System.out.println("父類靜態代碼塊。");
}
public ExA() {
System.out.println("父類構造函數。");
}
{
System.out.println("父類非靜態代碼塊。");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子類靜態代碼塊。");
}
{
System.out.println("子類非靜態代碼塊。");
}
public ExB() {
System.out.println("子類構造函數。");
}
}
執行結果:父類靜態代碼塊。子類靜態代碼塊。父類非靜態代碼塊。父類構造函數。子類非靜態代碼塊。子類構造函數。
⑧ java文件編譯完成運行時找不到主類或無法載入Test.java
找不到主類是因為你的類裡面沒有這個方法:public static void mian(){String[]args}{
}
無法載入可能是因為你的類名和你的文件名不一致導致的
你還有什麼不懂得,追問我
⑨ 怎麼理解java中的靜態載入類和動態載入類
一.什麼是動態載入類 什麼是靜態載入類
Class.forName 不僅表示類的類類型,還代表了動態載入類。編譯時載入是靜態載入類,
運行時載入是動態載入類。
二.為何要使用動態載入類
我們寫了一個程序 並沒有寫A類和B類以及start方法?
⑩ java程序什麼是類載入
你可以了解一下 深入理解java虛擬機,
java類載入 是因為在運行時當它需要引用某個類的時候,會先去載入這個類,就是去讀這個class文件到內存裡面來,現在還沒有創建這個類的實例,
你可以理解為 你寫的java代碼在編譯成class文件後,並沒有去執行,或者去引用他,只有程序運行時它將要使用這個類的時候才會去讀取這個class文件,這時候叫做類載入,當緩存了這個類文件之後,後面的創建類的時候都會去引用它,因為類載入是運行是載入,所以java代碼在運行時是有辦法修改的,同樣java類載入也允許載入一個遠程的class文件,也代表它是支持程序不停止時更新程序代碼的。