static修飾的靜態變數與實例變數的區別,初始化內存運行機制詳解
1. 靜態變數的定義
靜態變數(Static Variable)在計算機編程領域指在程序執行前系統就為之靜態分配(也即在運行時中不再改變分配情況)存儲空間的一類變數。
說明:靜態變數(用static修飾),它所被分配的空間是一直伴隨程序運行的,空間將會保持到程序的結束關閉,才會被釋放。
2.用static修飾的靜態變數與普通變數的區別
假若在定義一個類的過程中,定義了一個static修飾的變數,那麼這個類在被載入的同時,被static修飾的變數就存在於內存當中了,這樣一來就獨立於該類的所有對象,被該類所有對象共享,將對象相關的變成了類相關,基於此靜態變數也可以稱之為類變數。
代碼說明:
class Person
{
// 定義一個實例變數
public String name;
// 定義一個類變數
public static int eyeNum;
}
public class PersonTest
{
public static void main(String[] args)
{
Person p1 = new Person();
Person p2 = new Person();
p1.name = "王";
p2.name = "向";
p1.eyeNum = 2;
p2.eyeNum = 3;
System.out.println("p1變數的name變數值是:" + p1.name
+ " p1對象的eyeNum變數值是:" + p1.eyeNum);
System.out.println("p2變數的name變數值是:" + p2.name
+ " p2對象的eyeNum變數值是:" + p2.eyeNum);
}
}
運行結果:
分析:
在此程序中,我們將eyeNum定義為靜態變數(即類變數),而name定義為普通的實例變數。
當運行Person p1 = new Person()時,代碼第一次使用Person類,因此需要載入這個Person類,在類準備階段,系統將會為該類的類變數分配內存空間,並對其指定初始值。Person初始化完成後,系統將在對內存中為Person類分配一塊內存區域。
系統接著創建Person對象,並將Person對象賦值給p1變數,在此時,Person對象里會包含名為name的實例變數,並對其指定初始值。在此,可以看出eyeNum並不屬於Person對象,而是屬於Person類。
接著執行Person p2 = new Person(),代碼創建第二個Person對象,因為在第一次創建Person時,已經對Person進行了初始化,Person已經存在於對內存中了,因此,在此創建時,不需要再次進行初始化操作,創建過程同p1,在此不做示意圖解釋。
當執行該段代碼時
p1.name = "王";
p2.name = "向";
系統會向p1和p2所指向的實例變數分別賦值。
p1.eyeNum = 2;
p2.eyeNum = 3;
當執行到p1.eyeNum = 2 時,將2賦值給類變數eyeNum,當執行到p2.eyeNum = 3時,又將變數3賦值給eyeNum,由於eyeNum靜態變數對該類所有對象共享的,因此在執行p2.eyeNum = 3時,會將之前的eyeNum值進行覆蓋,因此,輸出p1.eyeNum和p2.eyeNum兩個值的時候,都會顯示最後的賦值結果3.
作者:小鵬_Leo
原文:https://www.cnblogs.com/Leo-Xia/p/10291180.html
※谷歌是如何加強Kubernetes容器安全的?
※MySql中exists和in的區別
TAG:程序員小新人學習 |