java0601 static 靜態

3.6STATIC 關鍵字

static關鍵字:
用法:用於修飾成員:成員變量和成員函數。static不在堆內存中
被修飾後的成員有以下特點:
隨着類的加載而加載。
優先於對象存在。
被所有對象共享。
可以直接被類名調用。使用方法:類名.靜態成員

使用注意:
靜態方法只能訪問靜態成員。

如,國籍是共享的,而年齡、姓名是特有的。
特有內容隨着對象存儲於對內存中,而靜態static在方法區中。(又稱共享區,數據區)
主函數是靜態的。

class MainDemo{
public statci void main(String[] args)
{
System.out.println("hello world!");
}
}

主函數:是一個特殊的函數,是程序的入口,可被jvm調用。
public:代表該函數訪問權限是最大的。
static:代表主函數隨着類的加載而存在。
void:無返回值。
main:不是關鍵字。但是是特殊保留單詞,可以被jvm識別。
參數String[] Args:主函數的參數,數組型。該數組中的元素是字符串。

通過參數不同可以對主函數進行重載。
jvm只會調用特定格式的主函數。
主函數是格式固定的,虛擬機識別。
------------------------------------------------------------------------
什麼時候使用靜態?

要從兩方面下手:
因爲靜態鏽蝕的內容可以有 成員變量和函數。

當對象中有共享數據時候,該數據被靜態鏽蝕。
對象中特有的數據定義爲非晶態存在於堆內存中的(對象內部)

什麼時候定義靜態函數?

首先,靜態函數只能訪問靜態。當功能內部沒有訪問到非靜態數據(對象的特有數據),
那麼該功能可定義爲靜態的。
class Person
{
String name;
public void show(){
S.O.P("haha");
}
}

這個方法沒訪問非靜態內部數據(特有數據)。

如果方法沒有訪問到內部特有數據,直接用類名調用即可方便使用,不用創建類之後再調用。

--------------------------------------------------------------------------------------------------
靜態的應用。
早前寫法與現狀寫法。

class Demo
{
public static void main(String[] args)
{
int[] arr = [3,4,1,8];

int max = getMax(arr);
S.O.P("max"+arr[max]);
}
}

爲了方便複用,我們封裝成函數。
public static void getMax(int[] arr){
int max = 0;
for(int x=1; x
{
if(arr[x] >arr[max])
max = x;
}
return arr[max];
}

如果另一個程序中也用到了getMax方法,那麼可以把這個方法封裝成類,在多個程序中使用。
也就是說,共性的功能可以剝離並封裝,以便複用。

class ArrayTool{
public static void getMax(int[] arr){
int max = 0;
for(int x=1; x
{
if(arr[x] >arr[max])
max = x;
}
return arr[max];
}

public int getMin(int[] arr){
int min = 0;
for(int x=1; x
{
if(arr[x]
min = x;
}
return arr[min];
}
public void selectSort(int[] arr)
{
for(int x=0; x< arr.length - 1; x ++)
{
for(int y = x +1; y
{
if(arr[x] > arr[y])
{
swap(arr,y,y + 1);
}
}
}
}

public void bubbleSort(int[] arr)
{
for(int x = 0; x < arr.length - 1; x ++)
{
if(arr[y] > arr[y +1]
{
swap(arr,y,y + 1);
}
}
}
}

封裝好之後,如果想要使用,先編譯工具類生成class文件,再編譯調用類。

如果反過來,它會自動編譯內容包含的其他類(path下和當前目錄下)的class文件。沒有運行文件,會自動尋找java文件。

如果沒有class也沒有java,會提示 找不到符號。
-----------------------------------------------------------------------------------------------------
 幫助文檔 的製作

進行路徑設置的時候如果忘記打. set classpath=.;c:\myclass
這樣就可以了。

對於別人發來的class文件,需要說明書來了解其詳細功能。java的說明書通過文檔註釋來完成。


寫好之後,可以使用javadoc工具。
使用方法:javadoc -d myhelp 
-d:directory -author -version ArrayTool.java

如果ArrayTool類沒有被public封裝,那麼無法建立(權限不夠)

一個類中默認會有一個空參數夠贊函數。
這個默認的構造函數的權限和所屬的類一致。
如果類被public修飾,那麼磨人的夠贊函數也帶public修飾符,
如果沒有,那麼磨人的構造函數也沒有public修飾。

空參數 構造函數和默認構造函數是兩個概念。

-------------------------------------------------------------------------------------------------
靜態代碼塊
static{
靜態代碼塊中的語句
}


class StaticCode{
static 
{
System.out.println("a");
}
}
特點:隨着類的加載而執行,只執行一次。
用於爲類進行初始化(如果沒有對象初始化,可以用這個進行初始化。)

非得建立對象,類纔會被加載麼?
不是。調用靜態方法時也會執行類中的靜態代碼塊。

考試的時候考什麼?
靜態代碼塊、構造代碼塊、構造函數哪個先加載。
靜態->構造代碼塊->構造函數。
--------------------------------------------------------------------------------------------------------------
對象與內存。

Person p = new Person();

1.因爲new用到了person。class 文件,所以會先找到person。class文件並加載到內存中。
2.會執行該類中的static代碼塊(如果有的話),給Person.class類進行初始化。
3.在堆內存中開闢 空間,分配內存地址。
4.在堆內存中建立對象的特有屬性,並進行默認初始化。
5.對屬性進行顯示初始化。
6.對對象進行構造代碼塊初始化。
7.對對象進行對應的構造函數初始化。
8.將內存地址賦給內存中的p變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章