1. 程式人生 > >JAVA基礎(49)---static及static修飾變數

JAVA基礎(49)---static及static修飾變數

static

所解決的問題

這裡摘錄一下《Java程式設計思想(第四版)》(《Java核心技術Ⅰ卷/Ⅱ卷》)裡關於static關鍵字的一段原話:(P29)通常來說,當建立類時,就是在描述那個類的物件的外觀與行為 。除非用new建立那個物件,否則,實際上並未獲得任何物件。執行new來建立物件的時候,資料儲存空間才被分配,其方法才供外界呼叫。有兩種情形用上述方法是無法解決的。一種情形是,只想為某特定域分配單一儲存空間,而不去考慮究竟要建立多少個物件,甚至根本不需要建立任何物件。另一種情形是,希望某個方法不與包含他的類的任何物件關聯在一起。也就是說,即使沒有建立物件,也能夠呼叫方法。

簡單來說,static的主要目的

就是建立獨立於具體物件的域變數與方法

static 的使用

static可以修飾方法,還可以修飾變數、程式碼塊

static所修飾的方法和變數的特點

  1. 屬於當前類所有,與物件無關
  2. 呼叫方式:不需要建立物件就能夠直接使用,可以通過類名.屬性名/類名.方法名()
  3. 儲存空間:存在與方法區中靜態區
package org.lanqiao.staticdemo;

public class CountObject {
	public static void main(String[] args) {
		Person p1 = new Person();
		System.out.println("Person類的物件的數量為:" + Person.objNum());
		Person p2 = new Person();
		System.out.println("Person類的物件的數量為:" + Person.objNum());
		Person p3 = new Person("張三" ,20);
		System.out.println("Person類的物件的數量為:" +  Person.objNum());
		System.out.println("Person類的物件的數量為:" +  Person.objNum());
		System.out.println("Person類的物件的數量為:" +  Person.objNum());
		
	}
	
	
}
/*
 * 統計person類建立物件的個數
 */
class Person{
	
	private String name;
	private int age;
        static int objNum = 0 ;
	public Person() {
		objNum++;
	}
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
		objNum++;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

使用static所修飾的變數是屬於當前類所有,是所有物件所共有的。
使用static所修飾的變數是隨著類的載入而載入;而我們的成員變數 是隨著物件的建立而建立
對於靜態的變數的訪問方式:類名.屬性名

靜態變數隨著類的載入而建立,所以在Person載入到class區時,在靜態區就已經建立了bojNum,當p1要進行訪問時,底層實現其實是從class區Person儲存的一個靜態地址訪問到的靜態區。