1. 程式人生 > 其它 >Java中static關鍵字的作用及用法

Java中static關鍵字的作用及用法

1.static的概述

在Java中static是靜態修飾符,表示靜態的意思,用來修飾變數和方法

2.static的作用

  • 隨著類的載入而載入
    • //比如說我建立一個類,裡面有一個靜態方法,一個非靜態
      public class Animal {
              public void Dog() {
              }
              public static void Cat() {
              }
      //然後在main方法中分別使用這兩個類,對非靜態和靜態方法的引用方式是不同的,如下:public static void main(String[] args) {
                  Animal animal 
      = new Animal(); animal.Dog(); //沒有加static修飾的方法 必須通過物件來呼叫

      Cat(); //類一出現,用static修飾的變數和方法隨著類一塊就出現了,可以在直接用 }
  • 優先於物件存在
  • static修飾的東西被類的所有物件共享
    • public class Animal {
          //姓名設定初始值並且是靜態的
          public static String name="小貓咪";
          
          public String getname() {
              return
      this.name; } public void setname(String name) { this.name=name; } } //在test new Animal這個類然後輸出,輸出的結果會是姓名的初始值 public class Test { public static void main(String[] args) { Animal aaa = new Animal(); System.out.println(aaa.getname()); Animal bbb = new Animal(); System.out.println(bbb.getname()); } }
      //但如果通過aaa將初始值改成小狗,bbb輸出的也會是小狗 public class Test { public static void main(String[] args) { Animal aaa = new Animal(); aaa.setname("小狗"); System.out.println(aaa.getname()); Animal bbb = new Animal(); System.out.println(bbb.getname()); } }
  • 可以通過類名呼叫

這裡注意!!!!

  • 在靜態方法中不可以使用this關鍵字
  • 靜態方法只能訪問靜態的成員變數和靜態的成員方法

3.靜態變數和成員變數的區別

這裡我們來解釋一下

  • 所屬不同

    • 靜態變數屬於類,所以也稱為類變數

    • 成員變數屬於物件,所以也稱為例項變數(物件變數)

  • 記憶體中位置不同

    • 靜態變數儲存於方法區的靜態區

    • 成員變數儲存於堆記憶體

  • 記憶體出現的時間不同

    • 靜態變數隨著類的載入而載入,隨著類的消失而消失

    • 成員變數隨著物件的建立而存在,隨著物件的消失而消失

  • 呼叫不同

    • 靜態變數可以通過類名呼叫,也可以通過物件呼叫

    • 成員變數只能通過物件名呼叫

4.使用案例

  • 建立工具方法
  • 只需載入一次或者執行一次

5.程式碼塊

  • 定義:在Java中,使用{}括起來的程式碼被稱為程式碼塊,根據位置和宣告的不同,可以分為區域性程式碼塊,構造程式碼塊,靜態程式碼塊,同步程式碼塊。
    • 區域性程式碼塊在方法中出現;限定變數生命週期,及早釋放,提高記憶體利用率
    • 構造程式碼塊在類中方法外出現;多個構造方法方法中相同的程式碼存起,每次呼叫構造都執行,並且在構造方法前執行
    • 靜態程式碼塊在類中方法外出現,加了static修飾在類中方法外出現,並加上static修飾;用於給類進行初始化,在載入的時候就執行,並且只執行一次。
  • 執行順序:靜態程式碼塊>構造程式碼塊>構造方法

6.面試題

  • 看程式碼寫結果(思考程式碼塊的執行順序哦)
public class Student {
   static {
       System.out.println("Student 靜態程式碼塊");
   }
   {
       System.out.println("Student 程式碼塊");
   }
   public Student() {
      System.out.println("Student 構造方法");
   }
}
public class StudentTest {
  static {
      System.out.println("北大吳彥祖");
   }
public static void main(String[] args) {
      System.out.println("我是main方法");
      Student s1 = new Student();
      Student s2 = new student();
   }
}