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 variableName [=value][, variableName[=value]...];type可以是java的基本類型之一。
type可以是Java的引用類型(即類及接口類型)的名字,外部類或接口必須有訪
問權限,使用非lang包下的類必須先導入。
變量名(variableName),java約定變量名以能描述該變量意義的單詞表示(單詞小寫),以增加程序的可讀性。駝峰法則。
“=”,表示賦值,不是數學意義上的“等于”,java環境下的“等于”通常用于邏輯表達式,用符號“==”(雙等號)表示。賦值同樣不等于就相等喲,比如:
其中a、b為Integer型引用變量,賦的值都是129,但是兩者并不相等。
聲明格式
變量的訪問權限修飾符,訪問權限標識符比照類的訪問權限
static,靜態成員變量修飾符,與它相對應的是實例變量
final,最終變量修飾符,即常量
類變量與實例變量的相同點:
1)都可以用任意權限修飾符對訪問權限加以限制;2)都可以被類自身的方法直接調用。
類變量與實例變量的區別是:
1)存儲位置不同。靜態變量存儲于方法區 method area,而實例變量存儲于堆區heap area。
2)生命周期不同。靜態變量在加載類過程中優先加載,其生命周期取決于類的生命周期;實例變量在創建實例時才創建,它的生命周期取決于實例的生命周期。
3)引用對象不同。靜態變量屬于類,被類的所有實例共享,可以直接使用類名來引用也可以通過類的實例引用;而實例變量則屬于某個對象,它必須在創建對象后才可以
通過這個對象來使用。
4)使用方法不同。一個類只能有一個同名靜態變量,無論是通過類或者任何一個實例對靜態變量重新賦值,結果都是一樣;而一個類創建多少個實例就會有多少個同名實
例變量,各實例變量存儲空間不同,對其中一個實例變量重新賦值不影響其它實例的同名變量
JVM
method area,又叫靜態區,跟堆一樣,被所有的線程共享,它包含所有的class和static變量;方法區中包含的都是在整個程序中永遠唯一的元素。
Stack area 棧(stack)區(VM棧和本地棧),分為3部分:基本類型變量區、執行環境上下文、操作指令區。每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。每個線程包含一個棧區,棧中只保存基礎數據類型的對象的引用和自定義對象的引用,對象都存放在堆區中。棧區另外存放方法參數和局部變量,用于計算;
堆(heap)區存放對象,即類的實例。每個對象都包含一個與之對應的類的信息。jvm只含一個堆,被所有線程共享。堆中不存放基本類型的對象引用,只存放對象本身。
Java變量的分類
package codetest;public class Variable {public Variable(){}public Variable(int constructorVar){//No Initialization but only declare,and final only is permitted.System.out.println("constructorVar: "+ constructorVar);}static{int staticBlockVar ;//only final is permittedstaticBlockVar=2;//Modify the value of the static variableclassVar=1;System.out.println("staticBlockVar's value: "+staticBlockVar);//The variable is define in a static block, and Can't use out the block}{System.out.println("non-quasi-static");}int instanceVar=1;//The default value of 0 is automatically assigned to classVarint samenameVar;//instance variablestatic int classVar;void changVar(int newValOfMemberVar){//No Initialization but only declare,and final only is permitted.int samenameVar=1;//local variable,only final is permittedtry{this.samenameVar=3;//The use of a instance variable of the same name with local variable.System.out.println("The samenameVar local variable: "+ samenameVar);System.out.println("The samenameVar instance variable: "+this.samenameVar);instanceVar=newValOfMemberVar;classVar=2;int[] a;//do not initializeint[] array=new int[2];//Initialized to the default valuesarray[1]=2;//To the second element to the assignmentSystem.out.println("array[0]:"+ array[0]+ " array[1]:"+ array[1]);//System.out.println(a[0]);//error}catch(Exception ex){ex.toString();}//System.out.println(staticBlockVar);}public static void main(String[] args) {//靜態變量可以直接使用類名引用 System.out.println("classVar: "+Variable.classVar);//實例變量必須通過對象來使用//System.out.println(Variable.member);//error:instanceVar is not a fieldVariable varObject =new Variable();System.out.println("varObject's instanceVar: "+varObject.instanceVar);//同一類的不同實例,分別為實例變量分配存儲空間Variable varOb =new Variable();varOb.changVar(2);System.out.println("varOb's instanceVar: "+varOb.instanceVar);System.out.println("varObject's instanceVar: "+varObject.instanceVar);//同一類的靜態變量,只分配一個存儲空間System.out.println("classVar: "+Variable.classVar);System.out.println("varOb classVar: "+varOb.classVar);System.out.println("varObject classVar:" + varObject.classVar);} }1.1 class variable(類變量):聲明在class內,method之外,且使用static修飾的變量,如上例中的classVar
1.2 instance variable(實例變量):聲明在class內,method之外,且未使用static修飾的變量。如上例中的instanceVar
類變量與實例變量的相同點:
1)兩者都可以用任意權限修飾符對訪問權限加以限制;2)兩者都可以被類自身的方法直接調用。3)兩者都可以不顯式初始化直接使用。java虛擬機會自動以默認值對它
們進行初始化,因此它沒有違反java所有的變量必須初始化以后才能使用的約定。
類變量與實例變量的區別是:
1)存儲位置不同。靜態變量存儲于方法區,而實例變量存儲于堆區。
2)生命周期不同。靜態變量在加載類過程中優先加載,其生命周期取決于類的生命周期;實例變量在創建實例時才創建,它的生命周期取決于實例的生命周期。
3)引用對象不同。靜態變量屬于類,被類的所有實例共享,可以直接使用類名來引用也可以通過類的實例引用;而實例變量則屬于某個對象,它必須在創建對象后才可以
通過這個對象來使用。
4)使用方法不同。一個類只能有一個同名靜態變量,無論是通過類或者任何一個實例對靜態變量重新賦值,結果都是一樣;而一個類創建多少個實例就會有多少個同名實
例變量,各實例變量存儲空間不同,對其中一個實例變量重新賦值不影響其它實例的同名變量。
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的類庫中大量的靜態方法正是出于此目的而定義的。
總結
以上是生活随笔為你收集整理的java-基础-变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何挂载阿里云Linux服务器的“数据盘
- 下一篇: 我的自我介绍以及决心书