Java學習個人備忘錄之關鍵字static

被static標記的東西會放在內存中被共享的,對象用到時,就會來取的。
class Person
{
	String name;  //成員變量,實例變量
	static String country = "CN";  //靜態變量,類變量
	public void show()
	{
		System.out.println(country+":"+name);
	}
}

class StaticDemo
{
	public static void main(String[] args)
	{
		Person p = new Person();
		System.out.println(p.country);
		System.out.println(Person.country);
	}
}

 

static的特點
1. static是一個修飾符,用於修飾成員。
2. static修飾的成員被所有的對象所共享。
3. static優先於對象存在,因爲static的成員隨着類的加載就已經存在了。
4. static修飾的成員多了一種調用方式,可以直接被類名所調用.  類名.靜態成員。
5. static修飾的數據是共享數據,對象中的存儲的特有數據。


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


靜態使用的注意事項
1. 靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)
2. 靜態方法中不可以定義this或者super關鍵字。
3. 主函數是靜態的。

class StaticDemo
{
	int num = 4;
	public static void main(String[] args)
	{
		new StaticDemo().show();  //在靜態方法中調用非靜態方法
	}
	public void show()
	{
		System.out.println(num);
	}
}


main函數
public static void main(String[] args)

主函數特殊之處:
1.格式是固定的。
2.被jvm所識別和調用。

public:因爲權限必須是最大的。
static:java虛擬機在調用時,是不需要對象的。
void:主函數沒有具體的返回值。
main:函數名,不是關鍵字,只是一個jvm識別的固定的名字。
String[] args:這是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型。

class MainDemo
{
	public static void main(String[] args) //new String[0]  創建時虛擬機傳進去一個數組
	{
		System.out.println(args);//[Ljava.lang.String;@c17164
		System.out.println(args.length);  
		System.out.println(args[0]);
		/*
		編譯:
			java MainDemo haha hehe xixi   # haha hehe xixi 是傳進去的三個參數

		輸出:
			3
			haha
		*/
		//傳進去的是數組,所以也可以這樣寫
		for (int x=0; x<args.length ; x++ )
		{
			System.out.println(args[x]);
		}
	}
}


靜態什麼時候用?
1. 靜態變量
    當分析對象中所具備的成員變量的值都是相同的。
    這時這個成員就可以被靜態修飾。
    只要數據在對象中都是不同的,就是對象特有數據,必須存儲在對象中,是非靜態的。
    如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,定義成靜態的。

2. 靜態函數
    函數是否用靜態修飾,就參考一點,就是該函數功能是否訪問到對象中的特有數據。
    簡單點說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要,該功能就是非靜態的。
    如果不需要,就可以將該功能定義成靜態的。


靜態代碼塊
隨着類的加載而執行,而且只執行一次。

作用:
    用於給類進行初始化。

class StaticCode
{
	static  //定義靜態代碼塊
	{
		System.out.println("hahahah");
	}
	void show()
	{
		System.out.println("show run");
	}
}
class StaticDemo
{
	public static void main(String[] args)
	{
		new StaticCode().show();
		new StaticCode().show();
	}
}
/*
hahahah
show run
show run
*/

//  給類進行初始化
class StaticCode
{
	static int num;
	static  //定義靜態代碼塊
	{
		num = 10;
		System.out.println("hahahah");
	}
	static void show()
	{
		System.out.println("show run");
	}
}
class StaticDemo
{
	public static void main(String[] args)
	{
		StaticCode.show();
		//這時候的初始化就不能用構造函數了,因爲並沒有創建對象.
	}
}

 

class Person
{
	private String name;

	{ //構造代碼塊   可以所有對象進行初始化
		System.out.println("person run");
		cry(); //這樣就不用在每個構造函數中都寫了.
	}

	Person() //構造函數是給對應的對象進行鍼對性的初始化 
	{
		name = "baby";
		//cry();
	}
	Person(String name)
	{
		this.name = name;
		//cry();
	}

	public void cry()
	{
		System.out.println("哇哇");
	}
}
class StaticDemo
{
	public static void main(String[] args)
	{
		Person p = new Person(); //person run
	}
}

 

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