5.Java變量

5.Java變量

??轉(zhuǎn)載請保留原文鏈接:?http://dashidan.com/article/java/basic/Java變量.html

所有的程序都使用變量臨時存儲各種數(shù)據(jù), 在Java語言中變量必須在程序中被定義(或聲明)后才能使用, 必須為每個變量確定一個具體類型.Java中變量分為基礎(chǔ)類型變量和引用類型變量.

① 基礎(chǔ)類型變量

Java有八種基礎(chǔ)類型變量. 分為數(shù)字類型(四個整數(shù)型,兩個浮點型), 布爾型和字符類型.

1. 數(shù)字類型變量

byte 字節(jié)型變量,表示整數(shù),取值范圍(-2^8到2^8-1),不支持小數(shù).

byteb0=88;byteb1=-10;

short 短整型變量,表示整數(shù),取值范圍(-2^16到2^16-1),不支持小數(shù).

shorts0=99;shorts1=-1;

int 整型變量,表示整數(shù),取值范圍(-2^32到2^32-1),不支持小數(shù).

整形常量,范圍可以粗略即為正負21億之間,超過這個范圍需要采用long類型.

inti0=100000;inti1=-2;

long 長整型變量,表示整數(shù),取值范圍(-2^64到2^64-1),不支持小數(shù).

longl0=100000L;longl1=-3L;

float 浮點數(shù)類型,表示小數(shù),取值范圍(到).浮點數(shù)有舍入誤差.

定義變量時,需要在數(shù)字后邊加個字符f或者F,表示該數(shù)字為float類型.

floatf0=3.14f;floatf1=2.73F;

double: 浮點數(shù)類型,表示小數(shù),取值范圍(到).浮點數(shù)有舍入誤差.

定義變量時,需要在數(shù)字后邊加個字符d或者D,表示該數(shù)字為double類型.

doubled0=123.4d;doubled1=1.4D;

char 字符型,用英文單引號'定義.可以儲存任何字符.也可以當整數(shù)來用,但一般情況不建議這么用.

charc0='a';charc1='人';

數(shù)據(jù)類型和范圍

寫代碼時,根據(jù)數(shù)據(jù)類型和范圍選擇對應(yīng)的數(shù)字類型.超過類型的最大值或者小于最小值的數(shù)據(jù)會出錯.

java默認值

在java里面定義一個變量, 如果不主動給它賦值, 系統(tǒng)會自動給它賦一個值,這個值叫做`默認值`.

java數(shù)字類型的最大值和最小值

計算機存儲整形數(shù)據(jù)是以二進制方式存儲,有符號數(shù)據(jù)類型(byte, short, int, long, float)最小值為`-2^n`,最大值為`2^-1`,`n`為占用字節(jié)數(shù).無符號類型(char)最小值為0,最大值為2^16(65535). 存儲浮點類型數(shù)據(jù)表示范圍太大,采用科學計數(shù)法方式存儲,所以范圍會整數(shù)型大很多.

Java數(shù)字類型變量默認值和取值范圍

浮點數(shù)不是精確值

浮點數(shù)值不適合用于禁止出現(xiàn)舍入誤差的金融計算中. 例如:System.out.println(2.0-1.1); 將打印0.899999999999999,而不是0.9.因為浮點數(shù)值采用二進制系統(tǒng)表示,而二進制無法精確表示分數(shù)1/10,就像十進制無法精確表示1/3一樣.如果需要在數(shù)值計算中不含有舍入誤差,應(yīng)該使用BigDecimal類.

2. 布爾類型變量

boolean(布爾類型),只有兩個取值:true(是)和false(否). 默認值false.

booleanbo0=true;booleanbo1=false;

示例代碼:

packagecom.dashidan.lesson5;/*** 大屎蛋教程網(wǎng)-dashidan.com*

* Java教程基礎(chǔ)篇: 5. Java變量* 基礎(chǔ)類型變量*/publicclassDemo1{publicstaticvoidmain(String[]args){/** byte 變量*/byteb0=88;byteb1=-10;System.out.println(b0);System.out.println(b1);/** short 變量*/shorts0=99;shorts1=-1;System.out.println(s0);System.out.println(s1);/** int 變量*/inti0=100000;inti1=-2;System.out.println(i0);System.out.println(i1);/** long 變量*/longl0=100000L;longl1=-3L;System.out.println(l0);System.out.println(l1);/** float 變量*/floatf0=3.14f;floatf1=2.73F;System.out.println(f0);System.out.println(f1);/** double 變量*/doubled0=123.4d;doubled1=1.4D;System.out.println(d0);System.out.println(d1);booleanbo0=true;booleanbo1=false;System.out.println(bo0);System.out.println(bo1);/** char 變量*/charc0='a';charc1='人';System.out.println(c0);System.out.println(c1);System.out.println(c0+c1);}}

輸出:

88-1099-1100000-2100000-33.142.73123.41.4truefalsea人20251

② 字符串類型變量

字符串類型是對象類型,不屬于基礎(chǔ)類型. 賦值的時候?qū)儆谥祩鬟f. 在Java中,String是不可變(final)的.Java在運行時保存了一個字符串池(String pool),這使String成為了一個特別的類.

java中字符串為什么是不可變的?

只有當字符串是不可變的,字符串池才有可能實現(xiàn). 字符串池的實現(xiàn)可以在運行時節(jié)約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串.但如果字符串是可變的,那么`String interning`將不能實現(xiàn)(譯者注:String interning是指對不同的字符串僅僅只保存一個,即不會保存多個相同的字符串.),因為這樣的話,如果變量改變了它的值,那么其它指向這個值的變量的值也會一起改變.如果字符串是可變的,那么會引起很嚴重的安全問題.譬如,數(shù)據(jù)庫的用戶名、密碼都是以字符串的形式傳入來獲得數(shù)據(jù)庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入, 這個值如果被修改, 將會帶來很嚴重的安全隱患.

java中字符串不可變有什么優(yōu)點?

* 由于字符串的值是不可變的, 無改變字符串指向的對象的值,避免安全漏洞.

* 多線程安全, 同一個字符串實例可以被多個線程共享. 這樣便不用因為線程安全問題而使用同步.字符串自己便是線程安全的.

* 類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載. 譬如你想加載java.sql.Connection類,而這個值被改成了myhacked.Connection,那么會對你的數(shù)據(jù)庫造成不可知的破壞.

* 在它創(chuàng)建的時候hashcode就被緩存了,不需要重新計算. 這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象.這就是HashMap中的鍵往往都使用字符串.

字符串賦值

常用有2種方式: 直接通過=賦值, 和通過new String() 的方式創(chuàng)建字符串對象賦值.

Strings1="test0";Strings2=newString("test1");Strings3=newString(s2);

獲取字符串長度

通過String對象自帶的length()方法.

Strings0="test0";intsize=s0.length();

字符相加

通過+操作可以將2個字符串組合.

Strings0="test0";Strings1="test1";Strings2=s0+s1;

字符串比較

字符串比較內(nèi)容是否相同,需要通過equals()方法.

Java的虛擬機處理字符串相同的時候很神奇. 通常`==`對于引用類型的變量來說是判斷內(nèi)存地址是否相同. 但字符串這里虛擬機進行了優(yōu)化, 會通過Java獨有的"字符串池"技術(shù), 自動判斷上下文中是否有相同的字符串, 如果有相同的字符串, 則直接把原有的字符串對象拿來使用, 不重新創(chuàng)建字符串對象. 如果字符串發(fā)生改變則自動創(chuàng)建一個新的字符串對象.

示例代碼:

packagecom.dashidan.lesson5;/*** 大屎蛋教程網(wǎng)-dashidan.com** Java教程基礎(chǔ)篇: 5. Java變量* 字符串變量*/publicclassDemo2{publicstaticvoidmain(String[]args){Strings0="大屎蛋教程網(wǎng)";Strings1="大屎蛋教程網(wǎng)";Strings2=newString("大屎蛋教程網(wǎng)");/** equal比較字符串內(nèi)容*/booleanisSame=s0.equals(s1);System.out.println("1 equals isSame : "+isSame);isSame=s0.equals(s1);System.out.println("2 equals isSame : "+isSame);isSame=s0.equals(s2);System.out.println("3 equals isSame : "+isSame);/** s2 是通過new的方式從新創(chuàng)建的字符串對象,s0 s2 指向不同的內(nèi)存地址*/isSame=(s0==s2);System.out.println("4 == isSame : "+isSame);isSame=(s0==s1);/** 這里里的賦值,java虛擬機做了處理,自動指向了同一個字符串*/System.out.println("5 == isSame : "+isSame);/** 改變字符串 s0*/s0+="aaa";/** s0 發(fā)生變化*/System.out.println("s0 "+s0);/** s1 沒有發(fā)生變化*/System.out.println("s1 "+s1);/** 字符串s0 發(fā)生改變,虛擬機自動新建了一個字符串對象,s0 s1不再指向同一個字符串*/isSame=(s0==s1);System.out.println("6 == isSame : "+isSame);}}

輸出:

1 equals isSame : true2 equals isSame : true3 equals isSame : true4 == isSame : false5 == isSame : trues0 大屎蛋教程網(wǎng)aaas1 大屎蛋教程網(wǎng)6 == isSame : false

③ 引用類型變量

引用類型(reference type)指向?qū)ο笤趦?nèi)存空間的地址.

1. 什么是引用

把對象數(shù)據(jù)比喻為一座房子,引用就是門牌號. 一個對象在內(nèi)存中會請求一塊內(nèi)存空間來保存數(shù)據(jù),根據(jù)對象的大小, 需要占用的空間大小也不等. 訪問對象數(shù)據(jù)時, 不直接訪問對象在內(nèi)存中的數(shù)據(jù), 而是通過引用去訪問. 如果我們定義了不止一個引用指向同一個對象, 那么這些引用是不相同的, 因為引用也是一種數(shù)據(jù)類型, 需要一定的內(nèi)存空間(棧空間stack)來保存. 但是它們的指向的對象數(shù)據(jù)是相同的, 都指示同一個對象在內(nèi)存(堆空間heap)的中位置.

例:

Stringa="This is a Text!";Stringb=a;

a和b是不同的兩個引用,我們使用了兩個定義語句來定義它們. 但它們的值是一樣的, 都指向同一個對象 "This is a Text!".如圖:

String對象的值本身是不可更改的

像`b = "World";` `b = a;`這種情況不是改變了"World" 這一對象的值, 而是改變了它的引用`b`的值使之指向了另一個`String`對象`a`.

2.引用類型

java有3種引用類型

類class

接口interface

數(shù)組array

3.引用要點

引用是一種數(shù)據(jù)類型(保存在stack,棧空間), 保存了對象在內(nèi)存(heap,堆空間)中的地址.不是簡單數(shù)據(jù)類型也不是類實例(對象).

不同的引用可能指向同一個對象,換句話說, 一個對象可以有多個引用, 即該類類型的變量.

4.引用傳遞

引用傳遞也稱為傳地址.方法調(diào)用時,實際參數(shù)的引用(地址)被傳遞給方法中相對應(yīng)的形參和實參內(nèi)容相同,指向同一塊內(nèi)存地址,方法執(zhí)行中對引用的操作將會影響到實際對象. 詳情參考:參數(shù)的值傳遞與引用傳遞.

④ 變量作用域

Java變量從影響范圍劃分, 分為成員變量和局部變量.

1. 成員變量

類內(nèi)部定義的變量叫做成員變量,如果沒有設(shè)定初始值,系統(tǒng)會自動賦值為默認值. 作用范圍是整個類. 成員變量在所在類被實例化后,存在堆內(nèi)存中.

2. 局部變量

方法內(nèi)定義的變量被稱為局部變量,局部變量沒有默認值,聲明變量時必須設(shè)定初始值. 作用范圍從聲明開始,直到包含它的塊(對應(yīng)的大括號})結(jié)束. 局部變量在所在方法調(diào)用時,存在棧內(nèi)存中. 方法參數(shù)是局部變量,范圍涵蓋整個方法.

3. 示例代碼

packagecom.dashidan.lesson5;/*** 大屎蛋教程網(wǎng)-dashidan.com*

* Java教程基礎(chǔ)篇: 5. Java變量* 變量作用域*/publicclassDemo3{/*** a,b 是成員變量,整個方法都可以調(diào)用.*/publicstaticinta;publicstaticfloatb=3.0f;publicstaticvoidmain(Stringargs[]){/**? 在方法中調(diào)用成員變量, a為默認值, b為設(shè)定值*/System.out.println(a);System.out.println(b);testVar();/** 這里輸出變量m, n,編譯代碼時,會報錯,提示沒有定義變量m,n*///System.out.println(m);//System.out.println(n);}publicstaticvoidtestVar(){/**m,n 是成員變量,必須初始化賦值.作用域是在這個方法中. */intm=0;intn=1;System.out.println(m);System.out.println(n);}}

輸出:

03.001

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容