首頁  >  文章  >  Java  >  java靜態變數是什麼

java靜態變數是什麼

青灯夜游
青灯夜游原創
2021-05-08 12:01:0422725瀏覽

在java中,靜態變數指的是被static修飾的類別的變數;靜態變數被所有類別實例物件所共享,在記憶體中只有一個副本,當且僅當在類別初次載入時會被初始化。

java靜態變數是什麼

本教學操作環境:windows7系統、java8版、DELL G3電腦。

1. JVM運行時資料區域

java靜態變數是什麼

  • #Java堆存放幾乎所有的物件實例,被所有執行緒共享
  • 方法區(永久代)與Java堆一樣,是各個執行緒共享的記憶體區域,它用來儲存已經被虛擬機器載入類別的類別資訊、常數、靜態變數(static variable)等

2. static變數

被static修飾的類別的變量,也稱為靜態變數。 非靜態變數也稱為實例變數 

靜態變數和實例變數的差異是:

  • 靜態變數被所有類別實例物件所共享,在記憶體中只有一個副本,當且僅當在類別初次載入時會被初始化。
  • 實例變數是實例物件所擁有的,在創建物件的時候被初始化,存在多個副本,各個實例物件擁有的副本互不影響
public class MyStatic {
    // 静态变量
    private static int index = 0;

    // 实例变量
    private int count = 0;

    public void inc() {
        index++;
        count++;
    }

    public String  get() {
        return "静态变量index = " + index + ",  实例变量count = " + count;
    }
}
/**
 * index是静态变量
 * count是实例变量
 * */
public class StaticVariableTest {

    public static void main(String[] args) {
        MyStatic myStatic1 = new MyStatic();
        MyStatic myStatic2 = new MyStatic();
        MyStatic myStatic3 = new MyStatic();

        myStatic1.inc();
        System.out.println("myStatic1的index、count增加1:");
        System.out.println("myStatic1的" + myStatic1.get());
        System.out.println("myStatic2的" + myStatic2.get());
        System.out.println("myStatic3的" + myStatic3.get() + "\n");

        myStatic2.inc();
        System.out.println("myStatic2的index、count增加1:");
        System.out.println("myStatic1的" + myStatic1.get());
        System.out.println("myStatic2的" + myStatic2.get());
        System.out.println("myStatic3的" + myStatic3.get() + "\n");

        myStatic3.inc();
        System.out.println("myStatic3的index、count增加1:");
        System.out.println("myStatic1的" + myStatic1.get());
        System.out.println("myStatic2的" + myStatic2.get());
        System.out.println("myStatic3的" + myStatic3.get());
    }
}

運行結果:

java靜態變數是什麼

可以看出:

  • 靜態變數index是多個物件實例共享的
  • 實例物件count是多個物件實例私有的
myStatic1的index、count增加1:
myStatic1的静态变量index = 1,  实例变量count = 1
myStatic2的静态变量index = 1,  实例变量count = 0
myStatic3的静态变量index = 1,  实例变量count = 0

myStatic2的index、count增加1:
myStatic1的静态变量index = 2,  实例变量count = 1
myStatic2的静态变量index = 2,  实例变量count = 1
myStatic3的静态变量index = 2,  实例变量count = 0

myStatic3的index、count增加1:
myStatic1的静态变量index = 3,  实例变量count = 1
myStatic2的静态变量index = 3,  实例变量count = 1
myStatic3的静态变量index = 3,  实例变量count = 1

java靜態變數是什麼

3. static變數誤解

3.1 static無法作用於局部變量

  • C/C 中static是可以作用域局部變數的
  • Java中static是不允許用來修飾局部變數。
    不要問為什麼,這是Java語法的規定。
    java靜態變數是什麼

3.2 this可以存取靜態變數

靜態變數雖然獨立於對象,但是不代表不可以透過物件實例去訪問,所有的靜態方法和靜態變數都可以透過物件實例存取(只要存取權限足夠)。
this表示目前物件實例,而static靜態變數被所有物件所共享,所以可以透過this存取靜態變數

public class StaticVariable {
    public static int index = 1;

    public static void main(String[] args) {
        StaticVariable staticVariable = new StaticVariable();
        staticVariable.get();
    }

    private void get() {
        int index = 2;
        System.out.println(this.index);
    }
}

運行結果: 

java靜態變數是什麼

3.3 static不會改變類別成員的存取權

Java中的static關鍵字不會影響到變數或方法的作用域。在Java中能夠影響到存取權限的只有private、public、protected(包括包存取權)這幾個關鍵字

public class MyStatic {
    public static int index1 = 1;

    // 静态变量
    private static int index2 = 0;
}

public class StaticVariableTest {

    public static void main(String[] args) {
        System.out.println(MyStatic.index1);
        System.out.println(MyStatic.index2);
    }
}

java靜態變數是什麼

相關影片教學推薦: Java影片教學

以上是java靜態變數是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn