1. 程式人生 > >Java基礎知識回顧之static修飾屬性

Java基礎知識回顧之static修飾屬性

相關關鍵字的說明:
this關鍵字
final關鍵字
static關鍵字修飾屬性
static關鍵字修飾方法
static關鍵字應用與總結

static 關鍵字,我們在開發用的還是比較多的。在《Java程式設計思想》有下面一段話

static 方法就是沒有 this 的方法。在 static 方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫 static 方法。這實際上正是 static 方法的主要用途。

static 的用法比較廣泛:靜態變數、靜態成員、靜態函式等。我們在使用單列模式的時候,就會用到它。並且 static 資料成員儲存在靜態儲存區,只儲存一次,可以節省記憶體。

static 宣告屬性

static 修飾成員變數

當我們需要在一個類(class)中定義一個屬性為公共的屬性,就好比說我們需要這個屬性是所有類都是共有的,並且這個屬性的值是同一個。

Test.java

class Book{
	
	// 設定一個預設的值
	static String pub = "清華大學出版社";
	
	// 用來和 static 作為對比
	String description = "描述";
	
	// Book 類正常的屬性
	private String title;
	private double price;
	
	// Book 的構造類
	public
Book(String title, double price) { this.title = title; this.price = price; } // 獲取 Book 的資訊 public void getInfo(){ System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub + ",描述 "+ this.description); } } public class Test { public static void main(String[] args)
{ // 例項化三個Book類 Book book1 = new Book("Android開發實戰", 69.8); Book book2 = new Book("Java EE開發實戰", 49.8); Book book3 = new Book("Java 開發教程", 79.8); // 在沒有設定 pub 屬性的情況下輸出 book1.getInfo(); book2.getInfo(); book3.getInfo(); System.out.println("————————————————————無敵分割線————————————————————"); // 我們給 book1 設定一個 pub 屬性 book1.pub = "中信出版社"; book1.description = "這本書很牛逼,看了你就知道"; book1.getInfo(); book2.getInfo(); book3.getInfo(); } }

控制檯輸出

圖書名稱:Android開發實戰,價格為:69.8,出版社為:清華大學出版社,描述 描述
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:清華大學出版社,描述 描述
圖書名稱:Java 開發教程,價格為:79.8,出版社為:清華大學出版社,描述 描述
————————————————————無敵分割線————————————————————
圖書名稱:Android開發實戰,價格為:69.8,出版社為:中信出版社,描述 這本書很牛逼,看了你就知道
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:中信出版社,描述 描述
圖書名稱:Java 開發教程,價格為:79.8,出版社為:中信出版社,描述 描述

從控制檯輸出的結果,可以看到:

  • 如果給 屬性 賦預設值,在上面的例子中是(description 和 pub),輸出的結果為都是預設的。
  • 當我們修改了類中 static 關鍵字宣告的屬性,那麼只要修改了一次,那麼其他所有的物件的這個屬性都配修改了。

通過類呼叫 static 宣告的屬性

但是基於上面的程式碼,我們發現如果是其中的一個類物件就改變了所有的物件的屬性,這樣子操作是不是感覺不是特別好?然後在Java中,如果是使用 static 宣告的屬性值,是可以直接通過類呼叫的。

public class Test {

	public static void main(String[] args) {
		// 例項化三個Book類
		Book book1 = new Book("Android開發實戰", 69.8);
		Book book2 = new Book("Java EE開發實戰", 49.8);
		Book book3 = new Book("Java 開發教程", 79.8);
		
		// 在沒有設定 pub 屬性的情況下輸出
		book1.getInfo();
		book2.getInfo();
		book3.getInfo();
		
		System.out.println("————————————————————無敵分割線————————————————————");
		
		// 我們使用 Book 類直接呼叫pub
		Book.pub = "中信出版社";
		
		book1.description = "這本書很牛逼,看了你就知道";
		
		book1.getInfo();
		book2.getInfo();
		book3.getInfo();
	}
}

沒有例項化類時,呼叫 static 屬性

Test.java

class Book{
	
	// 設定一個預設的值
	static String pub = "清華大學出版社";
	
	// 用來和 static 作為對比
	String description = "描述";
	
	// Book 類正常的屬性
	private String title;
	private double price;
	
	// Book 的構造類
	public Book(String title, double price) {
		this.title = title;
		this.price = price;
	}
	
	// 獲取 Book 的資訊
	public void getInfo(){
		System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub + ",描述 "+ this.description);
	}
}

public class Test {

	public static void main(String[] args) {
		// 在沒有例項化物件時,就呼叫
		System.out.println(Book.pub);
		
		// 沒事例項化物件的時候,去給static屬性賦值上預設值
		Book.pub = "北京大學出版社";
		System.out.println(Book.pub);
		
		// 新建一個類,輸入 pub 屬性
		Book book = new Book("Java", 88);
		book.getInfo();
	}
}

控制檯輸出

清華大學出版社
北京大學出版社
圖書名稱:Java,價格為:88.0,出版社為:北京大學出版社,描述 描述

由此,我們看出,在沒有例項化物件的時候,就可以直接通過類去掉用 static屬性,並且還可以修改 static 的屬性。static 屬性宣告雖然是在類的結構中,但是並不受到物件的控制,是獨立存在的。

static 屬性與非 static 屬性的區別

static 宣告的屬性和普通屬性(非 static 屬性)最大的區別在於儲存的記憶體區域不同。static 所修飾的在靜態資料區。而不是在堆和棧。

static 屬性與非 static 屬性還有一個最大的區別,就是在於所有非 static 屬性必須產生例項化之後才可以訪問,但是static 屬性不受例項化物件的控制。也就是說,在沒有產生例項化物件的情況下,依然可以使用 static 物件。