1. 程式人生 > >Java static修飾屬性(類變數)、static修飾方法(類方法)

Java static修飾屬性(類變數)、static修飾方法(類方法)

注:靜態的結構(static的屬性、方法、程式碼塊、內部類)的宣告週期要早於非靜態類,同時被回收也晚於非靜態類。

一、static修飾屬性(類變數)

 1.由類建立的所有的物件,都共用這一屬性。

 2.類變數隨著類的載入而載入,即使此類還未new過物件,這個類變數也存在,而且僅一份;

 然而,例項變數是類new過之後才有的,而且每個物件都存一份。

 3.類變數的載入早於物件。

 4.類變數存放在靜態域中。


public class TestSportsMan {
	public static void main(String[] args) {
		SportsMan sp1 = new SportsMan("劉翔",18);
		SportsMan sp2 = new SportsMan("姚明",20);
		System.out.println(sp1);//SportsMan [name=劉翔, age=18, nation=null]		
		System.out.println(sp2);//SportsMan [name=姚明, age=20, nation=null]
		
		/**
		 * SportsMan類中的nation屬性是static修飾的,由這個類建立的物件都共用這個屬性。
		 * 
		 * 類變數的載入早於物件,所以既可以用“sp1.nation”,也可以用“SportsMan.nation”調。
		 * 
		 * 當其中一個物件對此類變數進行修改,會影響其他物件的類變數的一個呼叫。
		 */
		System.out.println("SportsMan.nation="+SportsMan.nation);//SportsMan.nation=null
		sp1.nation = "China";
		System.out.println("SportsMan.nation="+SportsMan.nation);//SportsMan.nation=China
		SportsMan.nation = "PRC";
		System.out.println("SportsMan.nation="+SportsMan.nation);//SportsMan.nation=PRC
		
		System.out.println(sp1);//SportsMan [name=劉翔, age=18, nation=PRC]
		System.out.println(sp2);//SportsMan [name=姚明, age=20, nation=PRC]
	}
}

class SportsMan {
	String name;
	int age;
	static String nation;
	
	public SportsMan(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	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;
	}

	@Override
	public String toString() {
		return "SportsMan [name=" + name + ", age=" + age + ", nation=" + nation + "]";
	}
}

二、static修飾方法(類方法)

1.隨著類的載入而載入,就算沒有new類,類方法還是存在,且僅存在一份。

2.類方法內部可以呼叫靜態的屬性和靜態的方法,而不能呼叫非靜態的屬性和方法;

反之,非靜態方法可以呼叫靜態的屬性和方法。