天天看點

java-基礎-變量

在java中,資料是以常量和變量兩種方法形式進行存儲和表示的(實際上,所有程式的資料都是這兩種形式)。

第一類:邏輯型boolean 預設初始值是false 1Byte

第二類:文本型char 2Byte unicode編碼,一個漢字兩個位元組

第三類:整數型(byte、short、int、long)

byte 1 Byte -128-127

short 2Byte

int 4Byte java預設是INT

long 8Byte L

不受作業系統的影響保證了java的移植性。

第四類:浮點型(float、double)

double 是預設的

float F

在數學中0到1有無數個浮點數;而計算機是離散的,是以表示的時候有誤差,計算機用精度(小數點後幾位來表示正确),比較浮點數時a==0.1是不合适的,應該a-0.1==0;如果a是0.1,則即使有誤差 a-0.1==0因為a和0.1都被表示為一個有誤差的計算機二進制。比較按照精度來算。

type可以是java的基本類型之一。

type可以是Java的引用類型(即類及接口類型)的名字,外部類或接口必須有訪

問權限,使用非lang包下的類必須先導入。

變量名(variableName),java約定變量名以能描述該變量意義的單詞表示(單詞小寫),以增加程式的可讀性。駝峰法則。

“=”,表示指派,不是數學意義上的“等于”,java環境下的“等于”通常用于邏輯表達式,用符号“==”(雙等号)表示。指派同樣不等于就相等喲,比如:

其中a、b為Integer型引用變量,賦的值都是129,但是兩者并不相等。

聲明格式

變量的通路權限修飾符,通路權限辨別符比照類的通路權限

static,靜态成員變量修飾符,與它相對應的是執行個體變量

final,最終變量修飾符,即常量

類變量與執行個體變量的相同點:

1)都可以用任意權限修飾符對通路權限加以限制;2)都可以被類自身的方法直接調用。

類變量與執行個體變量的差別是:

1)存儲位置不同。靜态變量存儲于方法區 method area,而執行個體變量存儲于堆區heap area。

2)生命周期不同。靜态變量在加載類過程中優先加載,其生命周期取決于類的生命周期;執行個體變量在建立執行個體時才建立,它的生命周期取決于執行個體的生命周期。

3)引用對象不同。靜态變量屬于類,<code>被類的所有執行個體共享</code>,可以直接使用類名來引用也可以通過類的執行個體引用;而執行個體變量則屬于某個對象,它必須在建立對象後才可以

通過這個對象來使用。

4)使用方法不同。一個類隻能有一個同名靜态變量,無論是通過類或者任何一個執行個體對靜态變量重新指派,結果都是一樣;而一個類建立多少個執行個體就會有多少個同名實

例變量,各執行個體變量存儲空間不同,對其中一個執行個體變量重新指派不影響其它執行個體的同名變量

method area,又叫靜态區,跟堆一樣,被所有的線程共享,它包含所有的class和static變量;方法區中包含的都是在整個程式中永遠唯一的元素。

Stack area 棧(stack)區(VM棧和本地棧),分為3部分:基本類型變量區、執行環境上下文、操作指令區。每個棧中的資料(原始類型和對象引用)都是私有的,其他棧不能通路。每個線程包含一個棧區,棧中隻儲存<code>基礎資料類型的對象的引用和自定義對象的引用</code>,對象都存放在堆區中。棧區另外存放<code>方法參數和局部變量</code>,用于計算;

堆(heap)區存放<code>對象</code>,即類的執行個體。每個對象都包含一個與之對應的類的資訊。jvm隻含一個堆,被所有線程共享。堆中不存放基本類型的對象引用,隻存放對象本身。

1.1 class variable(類變量):聲明在class内,method之外,且使用static修飾的變量,如上例中的classVar

1.2 instance variable(執行個體變量):聲明在class内,method之外,且未使用static修飾的變量。如上例中的instanceVar

1)兩者都可以用任意權限修飾符對通路權限加以限制;2)兩者都可以被類自身的方法直接調用。3)兩者都可以不顯式初始化直接使用。java虛拟機會自動以預設值對它

們進行初始化,是以它沒有違反java所有的變量必須初始化以後才能使用的約定。

1)存儲位置不同。靜态變量存儲于方法區,而執行個體變量存儲于堆區。

3)引用對象不同。靜态變量屬于類,被類的所有執行個體共享,可以直接使用類名來引用也可以通過類的執行個體引用;而執行個體變量則屬于某個對象,它必須在建立對象後才可以

例變量,各執行個體變量存儲空間不同,對其中一個執行個體變量重新指派不影響其它執行個體的同名變量。

1.3 formal parameter variable(形參變量),包括一般方法參數變量(method parameter,聲明在method小括号内的變量,如上例中的newValOfMemberVar)和構造器參數

變量(constructor parameter,聲明在constructor小括号内的變量,如上例中的constructorVar)。java要求形參變量,隻能使用預設通路權限和final聲明,并且聲明

時不能同時初始化。

1.4 local variable(狹義的局部變量):聲明在method内的變量,隻能以final修飾。

當方法内的局部變量與成員變量(指類變量或執行個體變量)同名時,以”this”關鍵字加以差別。如上例中執行個體變量sameanmeVar與方法changVar()中定義的局部變量

sameanmeVar同名,執行個體變量在使用時加字首“this.”與局部變量加以差別。

1.5 exception-handler parameter(異常辨別變量):聲明在catch小括号内的變量,如上例中ex。

異常辨別變更即catch方法的形參必須聲明為Exception對象及其子對象類型,它隻用于緊跟着的執行語句塊内。

1.6 array element(數組):數組的元素值沒有識别名稱,必須透過數組和索引值(index)來識别,索引值從0開始。如上例中array數組第2個元素的使用。

建立一個數組,如果沒有直接指派,jVM會自動為它所有的元素初始為預設值。注意:是建立一個數組,不是聲明一個數組。如上例中數組a[]隻聲明沒有初始,使用會提

示錯誤。

1.7-1.8 static block variable(靜态塊變量主)和非靜态塊(non-quasi-static):聲明在靜态塊内(static{…})或非靜态塊内({})的變量。如上例中的變量

staticBlockvar。它隻能由final修飾,并且僅用于在聲明的靜态塊内。

在使用這兩種變量時要注意它們所在塊的不同。一是執行時間不同。非靜态變量是執行構造方法之前;靜态塊在類檔案加載後的初始化階段執行 。二是執行次數不同。靜

态塊隻在類加載初始過程中執行一次;每一次初始化對象,都會導緻一次非靜态塊的執行。這部分詳細資訊請參閱欣’s部落格-《Java中自由塊的執行順序》。

2、根據變量記憶體來分類,Java變量有兩種:

2.1 heap variable:占用的記憶體在heap中,這類變量包括了class variable,instance variable,array component,這類變量會自動被JVM初始化預設值。

2.2 stack variable:通常廣義的局部變量(pan-local variable),其占的記憶體在stack中,這類變量包括了狹義的局部變量,method parameter,exception-handler

parameter,constructor parameter。狹義的局部變量不會被JVM初始化成預設值,使用者必須自行初始化該變量,但是parameter類(包括method parameter,exception-

handler parameter,constructor parameter)會被JVM初始化成傳入值(即實參)。

3、根據使用方式來為變量分類,主要有三種:

3.1 class variable,與根據聲明分類對應。

3.2 instance variable,與根據聲明分類對應。

3.3 廣義的局部變量,除了上面兩種以及數組元素以外,都可視為廣義的局部變量,數組通常被視為對象,array component視為對象的instance variable.

1、在Java中,所有的變量必須先聲明再使用。

2、在static 方法中引用任何執行個體變量都是非法的。

一般來說,靜态方法常常為應用程式中的其它類提供一些實用工具所用,在Java的類庫中大量的靜态方法正是出于此目的而定義的。