Ⅰ java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中,還是當被調用的時候才進行載入呢
當類第一次被調用時載入(靜態方法,靜態屬性的載入就是類載入) 。
1、類中的靜態屬性會被加入到類對象(也可以叫做類的模板,是類的描述) 的構造器中,靜態方法也會被加入到類對象中。
2、當第一次使用類時,JVM會通過類載入器,載入類對象,從而初始化靜態屬性,並裝入類的方法,包括靜態方法和實例方法(方法不會被調用,只是載入,從這個意義上來說,靜態方法和實例方法是類似的)。
3、當創建類的實例對象時,JVM會調用類的構造器,從而初始化類的屬性。
(1)java靜態方法的載入擴展閱讀:
類(包括靜態方法、屬性)載入過程:
一、載入。
根據一個類的全限定名(如cn.e.h.test.HelloWorld.class)來讀取此類的二進制位元組流到JVM內部。
將位元組流所代表的靜態存儲結構轉換為方法區的運行時數據結構(hotspot選擇將Class對象存儲在方法區中,Java虛擬機規范並沒有明確要求一定要存儲在方法區或堆區中)轉換為一個與目標類型對應的java.lang.Class對象。
二、連接。
1、驗證。
驗證階段主要包括四個檢驗過程:文件格式驗證、元數據驗證、位元組碼驗證和符號引用驗證;
2、准備。
為類中的所有靜態變數分配內存空間,並為其設置一個初始值(由於還沒有產生對象,實例變數將不再此操作范圍內);
3、解析。
將常量池中所有的符號引用轉為直接引用(得到類或者欄位、方法在內存中的指針或者偏移量,以便直接調用該方法)。這個階段可以在初始化之後再執行。
Ⅱ JAVA中使用靜態方法
編程時我們心裡一定要清楚靜態方法和類的非靜態方法方法的區別:
最根本區別從編譯角度來說吧:
1)靜態(static)方法是編譯時直接載入載入到內存中(離cpu最近的一塊內存區域也稱為堆棧),比如程序的public static main(args []){}方法,你能實例話嗎?
靜態方法不能被實例化,也不允許被實例化!
現在很多Java集成工具邊寫邊編譯的
因此 你可以通過「類名」+「.」+「靜態方法的名()」來調用
2)非靜態方法(類的非靜態方法)通過關鍵字 「new」 字來實例化一個對象(object),這個對象放在 內存的另一塊區域 堆(heap)中。
也就是說編譯時,非靜態方法必須先實例化類的一個對象,通過「對象名」+「非靜態方法名()」來調用;
public class Student
{
private String name;
/************************************************************
*下面兩個方法是類的非靜態方法封裝 屬性name,看一下在 main()
*如何調用
************************************************************/
public set(string init_name)
{
this.name = init_name;
}
publc String get()
{
return this.name;
}
//構造函數
public Student(){}
public Student(String init_name)
{
this.name = init_name;
}
//下面是一個靜態方法,看一下它在main()中如何調用
public static void PrintClassName()
{
System.out.print("該類的名字:Student");
}
}
//MainClass類
pubic class MainClass
{
public static void main(args[])
{
//先調用靜態方法,不需要實例化對象
Student.PrintClassName();
//現在調用非靜態方法,一定要實例化對象
Student stu1 = new Student();
stu1.set("Join");
String stu1_name = stu1.get();
}
}
Ⅲ java普通方法和靜態方法的載入(注意是載入)時機相同嗎存儲方法耗費內存空間嗎
靜態方法放在Date數據區 可以直接調用 和STATIC 變數一樣的 在內存開始載入的時候就有空間了 普通方法是 程序運行到的時候才開始調用直接用
Ⅳ 在Java中載入配置文件,使用靜態載入和構造方法載入有什麼區別
構造方法是只有你在new對象的時候才會執行
靜態語句塊和靜態方法在類載入到內存的時候就已經執行了
靜態載入配置文件,在你啟動類似tomcat服務的時候就已經執行了