1.18 static的常见问题和使用误区
1)為什么要用”static“關鍵字?
通常來說,用 new 創建類的對象時,數據存儲空間才被分配,方法才供外界調用。有時候我們只想為特定域分配單一存儲空間,不考慮要創建多少對象或者說根本就不創建任何對象,有時候我們想在沒有創建對象的情況下也想調用方法。在這兩種情況下,static 關鍵字,滿足了我們的需求。
2)”static“關鍵字是什么意思?Java 中是否可以覆蓋(子類中如果創建了一個與父類中相同名稱、相同返回值類型、相同參數列表的方法,只是方法體中的實現不同,以實現不同于父類的功能,這種方式被稱為方法重寫,又稱為方法覆蓋。這里了解即可,教程后面我們會詳細講解)一個 private 或者是 static 的方法?
“static”關鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問。
Java 中 static 方法不能被覆蓋,因為方法覆蓋是基于運行時動態綁定的,而 static 方法是編譯時靜態綁定的。static 方法跟類的任何實例都不相關,所以概念上不適用。
3)是否可以在 static 環境中訪問非 static 變量?
static 變量在 Java 中是屬于類的,它在所有的實例中的值是一樣的。當類被 Java 虛擬機載入的時候,會對 static 變量進行初始化。如果你的代碼嘗試不用實例來訪問非 static 的變量,編譯器會報錯,因為這些變量還沒有被創建出來,還沒有跟任何實例關聯上。
4)static 靜態方法能不能引用非靜態資源?
不能,new 的時候才會產生的東西,對于初始化后就存在的靜態資源來說,不能引用它。
5)static 靜態方法里面能不能引用靜態資源?
可以,因為都是類初始化的時候加載的。
6)非靜態方法里面能不能引用靜態資源?
可以,非靜態方法就是實例方法,那是 new 之后才產生的,那么屬于類的內容它都認識。
使用誤區
1)static 關鍵字會改變類中成員的訪問權限嗎?
Java 中的 static 關鍵字不會影響到變量或者方法的作用域。在 Java 中能夠影響到訪問權限的只有 private、public、protected、friendly 這幾個關鍵字??聪旅娴睦泳兔靼琢?#xff1a;
定義一個 Student 類,代碼如下:
public class Student {public static String name = "張三";private static int age = 10; }定義 Main 類調用 Student 類的 age 屬性,代碼如下:
public class Main {public static void main(String[] args) {System.out.println(Student.name);System.out.println(Student.age);} }代碼第 4 行會提示錯誤“Student.age 不可視(The field Student.age is not visible)”,這說明 static 關鍵字并不會改變變量和方法的訪問權限。
2)能通過 this 訪問靜態成員變量嗎?
雖然對于靜態方法來說沒有 this,那么在非靜態方法中能夠通過 this 訪問靜態成員變量嗎?先看下面的一個例子,這段代碼輸出的結果是什么?
public class Main {static int value = 33;public static void main(String[] args) throws Exception {new Main().printValue();}private void printValue() {int value = 3;System.out.println(this.value); // 輸出 33} }這里面主要考察 this 和 static 的理解。this 代表什么?this 代表當前對象,那么通過 new Main() 來調用 printValue 的話,當前對象就是通過 new Main() 生成的對象。而 static 變量是被對象所享有的,因此在 printValue 中的 this.value 的值毫無疑問是 33。在 printValue 方法內部的 value 是局部變量,根本不可能與 this 關聯,所以輸出結果是 33。在這里永遠要記住一點:靜態成員變量雖然獨立于對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問(只要訪問權限足夠)。
3)static 能作用于局部變量么?
Java 語法規定 static 是不允許用來修飾局部變量。
總結
以上是生活随笔為你收集整理的1.18 static的常见问题和使用误区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.17 import static静态
- 下一篇: 1.19 final修饰符详解