final static 深度解析


  function test(){

    var a = b = 10;

  }

  test( );

  alert(b);

由上一篇博客說起,最后輸出的是10。引起歧義的原因是全局變量和局部變量的關系。順着這個話題,說說java中的這塊兒。總--分--總結構來敘述一下。

參考博客:

  static 詳細分析

  實例構造器是不是靜態方法

總:java中沒有全局變量這個概念,只有局部變量和成員變量兩個說法。

java中沒有“全局變量”的概念。而是有“靜態”這個概念。
1.static 修飾成員變量。
2.static 修飾成員方法。
3.static 修飾靜態代碼塊。
被static修飾的成員變量和成員方法獨立於該類的任何對象。即它不依賴於類的實例,被類的所有實例共享。 只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內找到他們。因此,static對象可以 在它的任何對象之前訪問,無需應用任何對象。
a.

接下來,對比final。

Java.lang.String類不可以被繼承,由於它被final所修飾。
1.final 修飾類;
2.final 修飾方法;
3.final 修飾變量(成員變量和局部變量)。
final修飾類,類不能夠被繼承,String類就是這種情況。final修飾方法,把方法鎖定,防止繼承它的類來修改它的含義。 final修飾變量,分為修飾基本數據類型變量和應用類型變量。基本數據類型的變量修飾之后不能改值;引用類型的變量初始化 之后不能再指向另外一個對象,但是可以改變當前對象的內容。

眾說紛紜:

1. (全民財富)在static方法內部不能調用非靜態方法,反過來是可以的。

2. static目的是,方便在沒有創建對象的情況下來進行調用(方法/變量)。被static關鍵字修飾的方法或者變量不需要依賴於對象來進行訪問,只要類被加載了,就可以通過類名去進行訪問。

3. 對於靜態方法來說,是沒有this的,因為它不依附於任何對象,既然都沒有對象,就談不上this了。

4. 在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因為非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。

5. 在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法/變量的。

6. 即使沒有顯示地聲明為static,類的構造器實際上也是靜態方法。但是為什么構造方法中?還可以用this來訪問成員變量呢??博客

  補充:靜態成員變量雖然獨立於對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問(只要訪問權限足夠)。

7. 靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一份兒,它當且僅當在類初次加載時會被初始化,由JVM對它初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多份兒,各個對象擁有的份兒互不影響。

8. static代碼塊,用來優化程序的性能。當類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。(只會在類加載的時候執行一次)

9. 在Java中切記:static是不允許用來修飾局部變量。不要問為什么,這是Java語法的規定。

10. Java中的String類就是一個final類。

11. 當用final修飾一個類時,表明這個類不能被繼承。要注意final類中的所有成員方法都會被隱式地指定為final方法。

12. 對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。

13. 被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內容是可變的。

14. 很多時候會容易把static和final關鍵字混淆,static作用於成員變量用來表示只保存一份兒,而final的作用是用來保證變量不可變。

public class Test {
    public static void main(String[] args)  {
        MyClass myClass1 = new MyClass();
        MyClass myClass2 = new MyClass();
        System.out.println(myClass1.i);
        System.out.println(myClass1.j);
        System.out.println(myClass2.i);
        System.out.println(myClass2.j);
 
    }
}
 
class MyClass {
    public final double i = Math.random();
    public static double j = Math.random();
}
  運行這段代碼就會發現,每次打印的兩個j值都是一樣的,而i的值卻是不同的。從這里就可以知道final和static變量的區別了。

 

Java基礎:

 Java內部類

 HashMap詳解  

 

算法:

 排序算法匯總

 改進的字符串匹配算法KMP

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM