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 物件。