摘要:前面一篇已經介紹了部分關于的用法,主要是介紹的是修飾變量的一些知識。現在的這篇介紹下修飾方法。方法調用非方法或者屬性錯誤的調用以下的操作都在下面進行的。只能調用屬性或者方法。所有的定于的結構不受實例化對象的控制。
前面一篇已經介紹了部分關于 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 定于的結構不受實例化對象的控制。即:在沒有實例化對象的時候訪問。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72383.html
摘要:屬性聲明雖然是在類的結構中,但是并不受到對象的控制,是獨立存在的。所修飾的在靜態數據區。也就是說,在沒有產生實例化對象的情況下,依然可以使用對象。 static 關鍵字,我們在開發用的還是比較多的。在《Java編程思想》有下面一段話 static 方法就是沒有 this 的方法。在 static 方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類...
摘要:通過修飾以后,可以表示其修飾的類方法和變量不可改變。如果不希望子類重寫父類的某個方法,那就使用關鍵字。在一些時候由于父類中的某些方法具備某些隱藏的特性,那么并且子類必須使用此方法操作的時候,就加上關鍵字。 簡介 在 Java 中我們把 final 稱為終結器,在 Java 中可以使用 final 定義類、方法、屬性。通過 final 修飾以后,可以表示其修飾的類、方法和變量不可改變。 ...
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(...
摘要:前半句是指線程內表現為串行的語義,后半句是指指令重排序現象和工作內存和主內存同步延遲現象。關于內存模型的講解請參考死磕同步系列之。目前國內市面上的關于內存屏障的講解基本不會超過這三篇文章,包括相關書籍中的介紹。問題 (1)volatile是如何保證可見性的? (2)volatile是如何禁止重排序的? (3)volatile的實現原理? (4)volatile的缺陷? 簡介 volatile...
摘要:前半句是指線程內表現為串行的語義,后半句是指指令重排序現象和工作內存和主內存同步延遲現象。關于內存模型的講解請參考死磕同步系列之。目前國內市面上的關于內存屏障的講解基本不會超過這三篇文章,包括相關書籍中的介紹。問題 (1)volatile是如何保證可見性的? (2)volatile是如何禁止重排序的? (3)volatile的實現原理? (4)volatile的缺陷? 簡介 volatile...
閱讀 3820·2021-10-12 10:12
閱讀 1453·2021-10-11 10:58
閱讀 2290·2021-10-09 10:01
閱讀 2597·2021-09-24 09:48
閱讀 2699·2021-09-09 11:38
閱讀 3526·2019-08-30 15:44
閱讀 1724·2019-08-30 14:22
閱讀 518·2019-08-29 12:42