91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解static 和 final 和 static final區別

發布時間:2020-10-04 03:04:10 來源:腳本之家 閱讀:305 作者:HA_Tinker 欄目:編程語言

眾所周知,static 是靜態修飾關鍵字:可以修飾變量,程序塊,方法,類。

1.修飾變量。

得知:如果static修飾的是變量,則JVM會將將其分配在內存堆上,該變量就與對象無關,所有對該變量的引用都指向同一個地址。

因此我們使用該變量的時候,直接指明類的靜態變量,當然修飾符必須 public

public class StaticBean {
   public static String A = "A";
 }

使用方式

 public static void main(String[] args) throws Exception{
    System.out.println(StaticBean.A);
  }

2.修飾程序塊,猜猜輸出結果是什么?。

public class BaseTest {
  
  static{
    System.out.println("B");
  }

  public static void main(String[] args) throws Exception{
    System.out.println("A");
  }
}

結論:JVM就會優先加載靜態塊中代碼,因此會優先輸出B,static 修飾代碼塊,這主要用于系統初始化。

B
A

3.修飾方法:在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調用靜態方法可以無需創建對象,靜態方法在訪問本類的成員時,只允許訪問靜態成員,而不允許訪問實例成員變量和實例方法。

public class StaticBean {
  public static String A = "A";
  public String D;
  public static void getMessage(){
    System.out.println(A);
    System.out.println(D);
  }
}

上面代碼,哪句是錯誤的,很顯然。

System.out.println(D);

4.修飾類。在我們的熟知之中,static 修飾符一般用于修飾變量,程序塊,方法,但是什么時候使用static來修飾類呢?

內部類。如果在外部類聲明為static,程序會編譯都不會過。

內部類特點如下:

  1. 1.不持有外部類的引用(普通內部類持有)
  2. 2.可以直接創建實例,不需要先創建外部類(普通內部類需要)
  3. 3.可以有靜態成員變量、方法(普通內部類不行)和非靜態成員變量、方法
  4. 4.只可以直接訪問外部類靜態成員,不可以直接訪問外部類的非靜態成員(普通內部類可以),需要通過傳入外部類引用的方式才能訪問
  5. 5.加載一個類時,其內部類不會同時被加載。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生

那就很簡單引出,什么時候會使用靜態內部類呢? 我們來看下以下一個例子

public class Outer {
  private int i = 0;

  public Outer() {
    i++;
    System.out.println("=====init Outer "+i+"====");

  }

  public static Outer getInstance(){
    return Inner.INSTANCE;
  }
  //靜態內部類
  public static class Inner{
    private static final Outer INSTANCE = new Outer();
  }
}

調用方

public class BaseTest {
  public static void main(String[] args) throws Exception{
    for(int i = 0; i < 1000;i++) {
      Outer.getInstance();
    }
  }
}

輸出結果:

=====init Outer 1====

 我們總結下:

由于 INSTANCE 是常量,因此只能賦值一次;它還是靜態的,因此隨著內部類一起加載,這種也是單例懶漢模式的一種實現方式,同時保證了線程安全。

final 關鍵字可以用來修飾類,方法和變量

1.修飾類

表示該類不允許被繼承,final類中的成員方法都會被隱式的指定為final方法。

public final class FinalBean {

  public void test(){

  }
}

2.修飾方法

表示該方法不能被重寫,一個類的private方法會隱式的被指定為final方法。

以下例子SunFinalBean的test方法報錯。

public class FinalBean {

  public final void test(){

  }

  public class SunFinalBean extends FinalBean{
    public void test(){
      
    }
  }
}

3.修飾變量

表示該變量必須初始化,且值不能改變。如果是基本類型則值不能改變,如果是引用類型,則引用地址不能改變,但是這個引用所指向的對象里面的內容還是可以改變的。

 猜猜看,以下那句通不過編譯器編譯。

public class FinalBean {
  private final int i = 0;
  private final int j;
  private final String name = "";

  public FinalBean(){
    j = 1;
    this.name.concat("123");
    this.name = "123";
  }
}

這句,記住final的原理即可理解,那為什么this.name.concat("123");不會報錯呢,因為底層實現是返回一個新的String對象

this.name = "123";

那static final 一起用:

static修飾的屬性強調它們只有一個,final修飾的屬性表明是一個常數(創建后不能被修改)。static final修飾的屬性表示一旦給值,就不可修改,并且可以通過類名訪問。

static final也可以修飾方法,表示該方法不能重寫,可以在不new對象的情況下調用。

以上所述是小編給大家介紹的static 和 final 和 static final區別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临清市| 晴隆县| 偃师市| 县级市| 洛扎县| 东源县| 定远县| 凤翔县| 彭泽县| 斗六市| 周口市| 华坪县| 日照市| 河源市| 泾源县| 玉环县| 年辖:市辖区| 雅江县| 平谷区| 如皋市| 会泽县| 昌吉市| 收藏| 和林格尔县| 泰和县| 新密市| 开鲁县| 车致| 汕尾市| 友谊县| 吴堡县| 平顶山市| 吴桥县| 安顺市| 金寨县| 新营市| 卫辉市| 潞西市| 静乐县| 安乡县| 凤山县|