前面一篇已經介紹了部分關於 static 的用法,主要是介紹的是 static 修飾變數的一些知識。現在的這篇介紹下 static 修飾方法。
static 修飾方法
沒有例項化類時,呼叫 static 方法
Test.java
class Book{
// 設定一個預設的值
private static String pub = "清華大學出版社";
// Book 類正常的屬性
private String title;
private double price;
// Book 的構造類
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public static void setPub(String p){
// 這裡不能使用 this.pub = p, 使用 eclipse 工具的時候,會提示 Cannot use this in a static context
// 因為 static 宣告的屬性是不受物件的控制的
pub = p;
}
// 獲取 Book 的資訊
public void getInfo(){
System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub );
}
}
public class Test {
public static void main(String[] args) {
// 在沒有例項化物件時,呼叫static的方法
Book.setPub("人民日報出版社");
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();
}
}
控制檯輸入出
圖書名稱:Android開發實戰,價格為:69.8,出版社為:人民日報出版社
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:人民日報出版社
圖書名稱:Java 開發教程,價格為:79.8,出版社為:人民日報出版社
我們可以看出來,用 static 宣告的方法和 static 宣告的屬性都不受物件的控制,即可以不用例項化物件就可以呼叫。
static 方法呼叫非 static方法或者屬性(錯誤的呼叫)
以下的操作都在 eclipse 下面進行的。報錯的提示在程式碼的註釋上面。
class Book{
// 設定一個預設的值
private static String pub = "清華大學出版社";
// Book 類正常的屬性
private String title;
private double price;
// Book 的構造類
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public static void setPub(String p){
// 這裡不能使用 this.pub = p, 使用 eclipse 工具的時候,會提示 Cannot use this in a static context
pub = p;
//如果是使用 this.title = "title" 或者 呼叫 this.getInfo(),就會報錯: Cannot use this in a static context
this.title = "title";
// 如果是 title = "title"
// 就會報錯:Cannot make a static reference to the non-static field title,並且提示 將 title 修為 static
title = "title";
// 如果是直接呼叫 getInfo()
// 就會報錯 Cannot make a static reference to the non-static method getInfo() from the type Book, 並且提示 將 getInfo() 修為 static 方法
getInfo();
}
// 獲取 Book 的資訊
public void getInfo(){
System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ this.pub );
}
}
非 static 方法呼叫 static 方法或者屬性
在上面的例子我們發現,在static 方法中有特別多的限制,但是在非static中,呼叫 static 屬性或者方法呢?
Test.java
class Book{
// 設定一個預設的值
private static String pub = "清華大學出版社";
// Book 類正常的屬性
private String title;
private double price;
// Book 的構造類
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public static void setPub(String p){
pub = p;
}
// 獲取 Book 的資訊
public void getInfo(){
// 呼叫static 方法
setPub("北京大學");
// 在列印輸出的時,呼叫 static屬性
System.out.println("圖書名稱:"+ this.title + ",價格為:"+ this.price + ",出版社為:"+ pub );
}
}
public class Test {
public static void main(String[] args) {
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();
}
}
控制檯輸出
圖書名稱:Android開發實戰,價格為:69.8,出版社為:北京大學
圖書名稱:Java EE開發實戰,價格為:49.8,出版社為:北京大學
圖書名稱:Java 開發教程,價格為:79.8,出版社為:北京大學
static 方法 與 非 static 方法的區別
- static 方法不能直接方法 非 static 屬性或者方法。只能呼叫 static屬性或者方法。
- 非 static 屬性或者方法可以方法任何的static 方法或者屬性,不受任何限制。
通過幾個例子來說明
我們在一個類中呼叫 static 方法的時候,可以直接呼叫 static方法。但是對於,非static 方法,我們必須要例項化物件,才能呼叫。
public class Test {
public static void print() {
System.out.println("測試static 方法");
}
public void printStr() {
System.out.println("測試非 static 方法");
}
public static void main(String[] args) {
print();
// 對於非static,我們必須要例項化物件了才能呼叫
new Test().printStr();
}
}
我們在開發中,經常會使用到工具類,我們的工具類一般都是按照如下定義的,在這個類中機會所有的方法都是 static 的,呼叫的時候就通過 Utils.方法名
直接呼叫。
class Utils {
public static int int2Str(String str) {
return Integer.valueOf(str);
}
public static int add(int x, int y) {
return x+y;
}
}
public class Test {
public static void main(String[] args) {
System.out.println( Utils.add(0, 1) );
}
}
分析
- 所有 非static 定義的結構,必須在類已經明確的產生了例項化堆空間,才可以使用。
- 所有的 static 定於的結構不受例項化物件的控制。即:在沒有例項化物件的時候訪問。