1. 程式人生 > >Java應用程式開發學習之static關鍵字應用

Java應用程式開發學習之static關鍵字應用

Java的static關鍵字和C/C++語言的關鍵字有所不同:

一旦在Java裡使用了static關鍵字,那麼這樣的內容不再屬於物件自己,而是屬於類本身的,所以凡是本類的物件,都共享一份。

1、使用Java static關鍵字修飾成員變數

以下是Stundent類。

package app_one;

public class Student {
	private int id = 0 ;
	private int age = 0; 
	private String name = null;
	static int id_count = 0 ;
	
	public Student(int age , String name)
	{
		this.age = age ; 
		this.name = name ;
		this.id = ++id_count ;
	}
	
	public int getage() {
		return age;
	}
	public void setage(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

以下是主類:

package app_one;
public class hello {

	public static void main(String[] args) 
	{
		Student st1 = new Student(14,"小明");
		System.out.println("年齡:" + st1.getage() + " 姓名:" + st1.getName() + " 序號:" + Student.id_count);
		Student st2 = new Student(15,"小紅");
		System.out.println("年齡:" + st2.getage() + " 姓名:" + st2.getName() + " 序號:" + Student.id_count);
		Student st3 = new Student(18,"小李");
		System.out.println("年齡:" + st3.getage() + " 姓名:" + st3.getName() + " 序號:" + Student.id_count);
	}
}

執行結果:

     從上面的案例可以看到,id_count是可以自動進行計數的,每一次例項化Student類的時候,id_count就自動+1,然後賦值給成員變數id,由於定義了static關鍵字的變數不再屬於物件,而是屬於類,所以在訪問的時候,我們可以用類名稱().靜態變數的形式來進行訪問。

2、使用static修飾成員方法

將上述程式中Student類的id_count修改為私有的靜態變數,並新增一個靜態的Get_idcount方法。

private static int id_count = 0 ;

public static int Get_idcount()
{
	return id_count ;
}

在主類中獲取id_count不通過類.變數的方式獲取,而是改為類.方法()的方式獲取。

Student.Get_idcount()

強調兩點:

1、

(1)成員方法可以訪問成員變數
(2)成員方法可以訪問靜態變數
(3)靜態方法可以訪問靜態變數
(4)靜態方法不可以訪問成員變數(非靜態)
原因:因為在記憶體中是先有的靜態內容,後有的非靜態內容

2、

(1)靜態方法當中不能使用this
原因:因為this代表當前物件,通過誰呼叫的方法,誰就是當前物件

 

總結:

一旦使用了static修飾成員方法,那麼這就成為了靜態方法,不屬於物件,而是屬於類本身的。
對於靜態方法來說,可以通過物件名進行呼叫,也可以直接通過類名稱來呼叫。

如果沒有static關鍵字,那麼必須首先建立物件,然後通過物件才能使用它
如果有了static關鍵字,那麼不需要建立物件,直接就能通過類名稱進行呼叫。

無論是成員變數,還是成員方法,如果有了static,都推薦使用類名稱進行呼叫。
靜態變數:類名稱.靜態變數
靜態方法:類名稱.靜態方法();

對於本類中的靜態方法,可以省略類名稱。

3、靜態static的記憶體圖

參照學習傳智的Java課程給出的圖,清晰易懂。

4、靜態程式碼塊

靜態程式碼塊格式:

public class 類名稱{
    static
    {
        //靜態程式碼塊的內容
    }
}

(1)特點:當第一次用到本類時,靜態程式碼塊執行唯一的一次,靜態內容總是優先於非靜態,所以靜態程式碼塊比構造方法先執行
(2)典型用途:用來一次性地對靜態成員變數進行賦值。
針對上面的案例做修改,在Student類中新增一個靜態程式碼塊:

package app_one;

public class Student {
	private int id = 0 ;
	private int age = 0; 
	private String name = null;
	private static int id_count = 0 ;
	static 
	{
		System.out.println("靜態程式碼塊執行!");
	}
	public Student(int age , String name)
	{
		System.out.println("構造方法執行!");
		this.age = age ; 
		this.name = name ;
		this.id = ++id_count ;
	}
	
	public int getage() {
		return age;
	}
	public void setage(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public static int Get_idcount()
	{
		return id_count ;
	}
}

然後主程式修改如下:

package app_one;
public class hello {

	
	public static void main(String[] args) 
	{
		Student st1 = new Student(14,"小紅");
		System.out.println("姓名: "+st1.getName() + " 年齡: " + st1.getage() + " 序號: "+Student.Get_idcount());
		Student st2 = new Student(14,"小李");
		System.out.println("姓名: "+st2.getName() + " 年齡: " + st2.getage() + " 序號: "+Student.Get_idcount());
	}
}

執行結果:

很明顯得出結論。

參考資料:傳智播客Java視訊學習課程筆記