Skip to content

Latest commit

 

History

History
121 lines (98 loc) · 4.22 KB

static 關鍵字.md

File metadata and controls

121 lines (98 loc) · 4.22 KB

static 關鍵字

特點

  1. static 是一個修飾符,用於修飾成員。
  2. static 修飾的成員被所有的對象所共享。
  3. static 優先於對象存在,因為static的成員隨著類的加載就已經存在了。
  4. static 修飾的成員多了一種調用方式,就可以直接被類名所調用。(類名.靜態成員)
  5. static 修飾的數據是共享數據,對象中存儲的是特有數據。
  6. 一般我們操作對象的特有數據較多,共享數據較少。
  7. 靜態方法中不可以使用 this 調用變量。

成員變量 & 靜態變量的區別

  1. 兩個變量的生命週期不同 成員變量隨著對象的創建而存在,隨著對象的被回收而釋放。 靜態變量隨著類的加載而存在,隨著類的消失而消失。
  2. 調用方式不同 成員變量只能被對象調用。 靜態變量可以被對象調用,還可以被類名調用(優先)。
  3. 別名不同 成員變量也稱為實例變量。 靜態變量稱為類變量。
  4. 數據存儲位置不同 成員變量數據存儲在堆內存的對象中,所以也較對象的特有數據。 靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也較對象的共享數據。

靜態使用的注意事項:

  1. 靜態方法只能訪問靜態成員(變量,方法)。(非靜態既可以訪問靜態,又可以訪問非靜態)
  2. 靜態方法中不可以使用 this 或者 super 關鍵字。
  3. 主函數是靜態的。(如要訪問非靜態成員則可以使用實例化的方式調用)

主函數特殊之處:

  • 格式是固定的。
  • 被 jvm 所識別和調用。
  • public static void main(String[] args) {} public: 因為權限必須是最大的。 static: 不需要對象,直接用主函數所屬類名調用即可。 void: 主函數沒有具體的返回值。 main: 函數名,不是關鍵字,只是一個 jvm 識別的固定的名字。 String[] args: 這是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。

使用時機

  • 靜態變量 當分析對象中所具備的成員變量的值都是相同的。 這時這個成員就可以被靜態修飾。 只要數據在對象中都是不同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。 如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,定義成靜態的。
  • 靜態函數 函數是否用靜態修飾,只要參考一點,就是該函數功能是否有訪問到對象中的特有數據。 簡單來講,從源代碼看,該功能是否需要訪問非靜態成員變量,如果需要,該功能就是非靜態的。 如果不需要,就可以將該功能定義成靜態的。 當然,也可以定義成非靜態,但是非靜態需要被對象調用,而僅創建對象調用非靜態且沒有訪問特有數據的方法,該對象的創建是沒有意義的。

靜態代碼塊

  • 隨著類的加載而執行,而且只執行一次。(較少用)
  • 作用: 用於給類進行初始化。(構造函數給對象初始化,有的類不需要創建對象)
  • 形式:
  static
  {
    System.out.println("Hello World");
  }

構造代碼塊

  • 隨著對象的加載而執行,優先於構造函數。
  • 作用: 如果某成員在每次對象加載都須執行,則可將其置於構造代碼塊中。
  • 形式:
  class Person {

    {
    //構造代碼塊
    
    }

    Person() {
    //構造函數
    
    }
    
  }

Example

public class Person {
	
	private int age;
	private String name;//成員變量或實例變量,對象特有數據
	static String country = "China";//靜態變量或類變量,對象共享數據
	
	//定義一個Person類的構造函數
	Person(String name, int age){
		
		this.name = name;
		this.age = age;
	}	
}

public class PersonDemo {
    
    int x = 3;
		
	public static void main(String[] args) {
		
		Person p = new Person("Jack", 19);
        System.out.println(p.country);//被對象調用
		System.out.println(Person.country);//以類名調用
		
		//實例化以調用非靜態成員
		PersonDemo p1 = new PerosnDemo();
		p1.show();
	}
	
	public void show() {
		System.out.println(x);
	}
}