1. 程式人生 > 實用技巧 >java--static關鍵字

java--static關鍵字

package com.xiaoai.test;

public class Test_static {
	
	public String name; //非靜態變數,每個物件擁有各自的變數,變數不被共享,在記憶體中會建立多個
	public static int age;  //靜態變數,在記憶體中只會建立一次,所有物件共享,隨著類的載入而存在,隨著類檔案的消失而消失
	
	public static void sttc_1(){ //靜態方法
		System.out.println("靜態");
	}
	
	//靜態方法
	public static void static_syso(){
		System.out.println("靜態方法中---輸出");
		//可以引用靜態變數
		age = 12;
		//--無法引用this
//		this.name = "xiaoai";
		//--無法引用非靜態變數
//		name = "nihao";
		//--無法引用非靜態方法
//		sys1();
		//--可以引用靜態方法
		sttc_1();
	}
	//非靜態方法
	public void sys1(){
		System.out.println("非靜態方法中---輸出");
		//可以引用this和非靜態變數
		this.name = "xiaoai";
		//可以引用靜態變數
		age = 12;
		//可以引用靜態方法
		sttc_1();
	}
	
	@Override
	public String toString() {
		return "Test_static [name=" + name + ",age=" +age + "]";
	}
	
	public static void main(String[] args) {
		Test_static t1 = new Test_static();

		t1.sys1();//可引用,物件可以呼叫非靜態方法
		t1.static_syso();//可引用,物件可以呼叫靜態方法,但是不推薦
		System.out.println(t1);
//		Test_static.sys1(); //不可引用,類名不可直接呼叫非靜態方法
		Test_static.static_syso(); //可引用,類名可直接呼叫靜態方法

		System.out.println(t1.name); //可引用,非靜態變數可以被物件.引用
//		System.out.println(Test_static.name); //不可引用,非靜態變數無法直接類名.引用

		System.out.println(t1.age); // 可引用,靜態變數可以被物件.引用
		System.out.println(Test_static.age); //可引用,靜態變數可以直接類名.引用
	}
}
  • 結果截圖

注意

  • 靜態函式可直接訪問靜態成員變數,不能直接訪問非靜態成員變數。

靜態函式可使用類名直接呼叫,這時候可能還沒有存在物件,而非靜態成員資料是隨物件的存在而存在。

  • 為什麼非靜態函式可直接訪問靜態與非靜態成員變數。靜態函式不能訪問非靜態的成員資料?

非靜態函式只能由物件呼叫,物件存在時,說明非靜態與靜態的資料都已載入好了,所以非靜態函式可隨便呼叫。
靜態函式不能訪問非靜態成員,是因為靜態成員資料隨物件存在而存在,靜態函式可直接由類名呼叫,此時可能沒有物件建立,也就沒有非靜態成員資料,所以靜態函式無法訪問非靜態成員。
*靜態函式只要存在有物件,那麼也可以訪問非靜態的資料,只是不能直接訪問而已。

  • 為什麼靜態函式不能使用this或super關鍵字。

因為靜態的函式可用類名呼叫,類名呼叫時可能不存在物件,而this關鍵字代表了一個函式的呼叫者物件,這時就產生了衝突。

個人結論:非靜態可隨意呼叫靜態,靜態無法呼叫非靜態