前面一篇已經介紹了部分關於 static 的用法,主要是介紹的是 static 修飾變量的一些知識。如今的這篇介紹下 static 修飾方法。java
Test.javaeclipse
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 聲明的屬性都不受對象的控制,便可以不用實例化對象就能夠調用。測試
如下的操做都在 eclipse 下面進行的。報錯的提示在代碼的註釋上面。this
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 屬性或者方法呢?code
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 方法,咱們必需要實例化對象,才能調用。ip
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) ); } }