Java基礎之靜態static

轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/49539247
本文出自【吳孝城的CSDN博客】

static是一個成員修飾符

定義功能時,如果功能不需要訪問類中定義的非靜態成員變量時,該功能就需要靜態修飾

如果一個數據需要被其所在類的所有實例共用時,就要用static修飾


靜態方法注意事項:

1、靜態方法只能訪問靜態成員,不能訪問非靜態的成員,

靜態方法可以調用非靜態方法,要用創建對象(new)的方法調用

好處:可以直接被類名調用,開發中建議用類名調用,不要創建對象調用:

類名.方法();

而不用:

類名 名稱 = new 類名();

名稱.方法();


1、靜態方法中不允許出現this,super關鍵字


原因:

1、靜態是隨着類的加載而加載的,也隨着類的消失而消失

2、靜態優先於對象存在,被對象共享,

3、因爲靜態先存在於內存中(當類加載的時候就進入內存),無法訪問後來的對象中的數據,

所以靜態無法訪問非靜態(非靜態是在調用的時候才進內存)

而且內部無法書寫this,因爲這時對象可能不存在,this沒有任何指向


class Student{
	private String name;		//成員變量
	private int age;			//成員變量
	
	Student(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	//speak方法訪問成員變量,所以不不需要靜態修飾
	//訪問了對象屬性,所以爲非靜態
	public void speak (){
		System.out.println("name=" + this.name + "age=" + this.age);
	}
	
	//定義一個學習功能,沒有訪問成員變量,需要靜態修飾
	public static void study(){
		System.out.println("學習......");
	}
}

class StudentDemo{
	public static void main(String[] arge){
		/*不建議用創建對象調用
		Student p = new Student("haha", 20);
		p.study();
		*/
		
		//建議用直接用類名調用
		Student.study();
	}
}


靜態變量和成員變量的區別:

1、所屬範圍不同

靜態變量所屬於類,成員變量所屬對象,靜態對象的數據在全局是唯一的,一改全改

靜態變量也稱爲類變量。成員變量也稱爲實例變量,對象變量

2、調用不同

靜態變量可以被對象和類調用(一般都用類名調用)

成員變量只能被對象調用

3、加載時期不同

靜態變量隨着類的加載而加載

成員變量隨着對象的加載而加載

4、內存存儲區域不同

靜態變量存儲在方法區中

成員變量存儲在堆內存中



靜態的主函數

public static void main (String[] args)

public :權限最大

static :不需要對象,直接用給定的類名就可以訪問該函數

void   :不需要返回值,主函數是虛擬機調用的

main   :固定的函數名

(String[] args) :主函數的參數列表,字符串類型的參數

args:全稱arguments ,參數,唯一可變的名稱

class MainDemo {
	public static void main (String[] args){
		//靜態函數不能用類名調用非靜態函數,
		//show();
		//MainDemo.show();
		
		//cla.show();
		
		//想調用非靜態函數,要用對象調用
		new MainDemo().show();
		new cla().show();
		
	}
	//非靜態方法
	void show(){
		System.out.println("show run");
	}
}

class cla{
	void show(){
		System.out.println("static class show");
	}
}


構造代碼塊

class Demo{
	int x = 10;
	{		/*構造代碼塊,只要創建對象會被調用,給所有對象初始化,
				構造函數只給對應的對象針對性的初始化*/
			//可以定義不同構造函數的共性代碼
		System.out.println("code run..." + 4);	//打印結果爲4
	}
	Demo(){
		System.out.println("demo run");
	}
	Demo(int x){
		System.out.println("demo run...." + x);
	}
}

class ConstructorCodeDemo{
	public static void main(String[] args){
		new Demo();
		new Demo(5);
		
		{	//局部代碼塊
			//如果一個變量只在這裏被調用,可以放在局部代碼塊裏,這樣不會浪費內存
			int i = 10;		
			System.out.println("局部代碼塊... "+ i);
		}
		
	}
}


靜態代碼塊

特點:隨着類的加載而加載,僅執行一次

作用:給類進行初始化。例如註冊

class Demo {
	int x = 10;				//非靜態變量,無法直接給靜態的靜態代碼塊調用
	/*
	要將變量修飾爲靜態後纔可以被調用,
	靜態這是有兩次初始化,第一次是默認初始化,
	第二次爲顯示初始化,就是賦值*/
	static int x = 10;		
	static{		//靜態代碼塊
		System.out.println("類一加載就執行的部分" + x);		//打印結果爲10
	}
	static void show(){
		System.out.println("show run");
	}
}

class StaticCode{
	public static void main(String[] args){
		Demo.show();
	}
}





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