日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java不可变量有哪些_5.Java变量

發(fā)布時(shí)間:2025/4/16 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java不可变量有哪些_5.Java变量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

5.Java變量

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

① 基礎(chǔ)類(lèi)型變量

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

1. 數(shù)字類(lèi)型變量byte?字節(jié)型變量,表示整數(shù),取值范圍(-2^8到2^8-1),不支持小數(shù).byte?b0?=?88;byte?b1?=?-10;short?短整型變量,表示整數(shù),取值范圍(-2^16到2^16-1),不支持小數(shù).short?s0?=?99;short?s1?=?-1;int?整型變量,表示整數(shù),取值范圍(-2^32到2^32-1),不支持小數(shù).

×××常量,范圍可以粗略即為正負(fù)21億之間,超過(guò)這個(gè)范圍需要采用long類(lèi)型.int?i0?=?100000;int?i1?=?-2;long?長(zhǎng)整型變量,表示整數(shù),取值范圍(-2^64到2^64-1),不支持小數(shù).long?l0?=?100000L;long?l1?=?-3L;float?浮點(diǎn)數(shù)類(lèi)型,表示小數(shù),取值范圍(到).浮點(diǎn)數(shù)有舍入誤差.

定義變量時(shí),需要在數(shù)字后邊加個(gè)字符f或者F,表示該數(shù)字為float類(lèi)型.float?f0?=?3.14f;float?f1?=?2.73F;double: 浮點(diǎn)數(shù)類(lèi)型,表示小數(shù),取值范圍(到).浮點(diǎn)數(shù)有舍入誤差.

定義變量時(shí),需要在數(shù)字后邊加個(gè)字符d或者D,表示該數(shù)字為double類(lèi)型.double?d0?=?123.4d;double?d1?=?1.4D;char?字符型,用英文單引號(hào)'定義.可以儲(chǔ)存任何字符.也可以當(dāng)整數(shù)來(lái)用,但一般情況不建議這么用.char?c0?=?'a';char?c1?=?'人';

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

寫(xiě)代碼時(shí),根據(jù)數(shù)據(jù)類(lèi)型和范圍選擇對(duì)應(yīng)的數(shù)字類(lèi)型.超過(guò)類(lèi)型的最大值或者小于最小值的數(shù)據(jù)會(huì)出錯(cuò).

java默認(rèn)值

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

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

計(jì)算機(jī)存儲(chǔ)×××數(shù)據(jù)是以二進(jìn)制方式存儲(chǔ),有符號(hào)數(shù)據(jù)類(lèi)型(byte, short, int, long, float)最小值為`-2^n`,最大值為`2^-1`,`n`為占用字節(jié)數(shù).無(wú)符號(hào)類(lèi)型(char)最小值為0,最大值為2^16(65535). 存儲(chǔ)浮點(diǎn)類(lèi)型數(shù)據(jù)表示范圍太大,采用科學(xué)計(jì)數(shù)法方式存儲(chǔ),所以范圍會(huì)整數(shù)型大很多.Java數(shù)字類(lèi)型變量默認(rèn)值和取值范圍類(lèi)型默認(rèn)值位數(shù)最小值最大值byte08-128127

short016-2^162^16-1

int032-2^322^32-1

long064-2^642^64-1

float0f32-3.4 * 10^383.4 * 10^38

double0d64-1.7 * 10^3081.7 * 10^308

char01602^16

booleanfalse1

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

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

2. 布爾類(lèi)型變量

boolean(布爾類(lèi)型),只有兩個(gè)取值:true(是)和false(否). 默認(rèn)值false.boolean?bo0?=?true;boolean?bo1?=?false;

示例代碼:package?com.dashidan.lesson5;/**

*?大屎蛋教程網(wǎng)-dashidan.com

*?

*?Java教程基礎(chǔ)篇:?5.?Java變量

*?基礎(chǔ)類(lèi)型變量

*/public?class?Demo1?{

public?static?void?main(String[]?args)?{

/**?byte?變量*/

byte?b0?=?88;

byte?b1?=?-10;

System.out.println(b0);

System.out.println(b1);

/**?short?變量*/

short?s0?=?99;

short?s1?=?-1;

System.out.println(s0);

System.out.println(s1);

/**?int?變量*/

int?i0?=?100000;

int?i1?=?-2;

System.out.println(i0);

System.out.println(i1);

/**?long?變量*/

long?l0?=?100000L;

long?l1?=?-3L;

System.out.println(l0);

System.out.println(l1);

/**?float?變量*/

float?f0?=?3.14f;

float?f1?=?2.73F;

System.out.println(f0);

System.out.println(f1);

/**?double?變量*/

double?d0?=?123.4d;

double?d1?=?1.4D;

System.out.println(d0);

System.out.println(d1);

boolean?bo0?=?true;

boolean?bo1?=?false;

System.out.println(bo0);

System.out.println(bo1);

/**?char?變量*/

char?c0?=?'a';

char?c1?=?'人';

System.out.println(c0);

System.out.println(c1);

System.out.println(c0?+?c1);

}}

輸出:88

-10

99

-1

100000

-2

100000

-3

3.14

2.73

123.4

1.4

true

false

a

20251

② 字符串類(lèi)型變量

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

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

只有當(dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn). 字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串.但如果字符串是可變的,那么`String interning`將不能實(shí)現(xiàn)(譯者注:String interning是指對(duì)不同的字符串僅僅只保存一個(gè),即不會(huì)保存多個(gè)相同的字符串.),因?yàn)檫@樣的話,如果變量改變了它的值,那么其它指向這個(gè)值的變量的值也會(huì)一起改變.如果字符串是可變的,那么會(huì)引起很?chē)?yán)重的安全問(wèn)題.譬如,數(shù)據(jù)庫(kù)的用戶名、密碼都是以字符串的形式傳入來(lái)獲得數(shù)據(jù)庫(kù)的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入, 這個(gè)值如果被修改, 將會(huì)帶來(lái)很?chē)?yán)重的安全隱患.

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

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

* 多線程安全, 同一個(gè)字符串實(shí)例可以被多個(gè)線程共享. 這樣便不用因?yàn)榫€程安全問(wèn)題而使用同步.字符串自己便是線程安全的.

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

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

字符串賦值

常用有2種方式: 直接通過(guò)=賦值, 和通過(guò)new String()?的方式創(chuàng)建字符串對(duì)象賦值.String?s1?=?"test0";String?s2?=?new?String("test1");String?s3?=?new?String(s2);

獲取字符串長(zhǎng)度

通過(guò)String對(duì)象自帶的length()方法.String?s0?=?"test0";int?size?=?s0.length();

字符相加

通過(guò)+操作可以將2個(gè)字符串組合.String?s0?=?"test0";String?s1?=?"test1";String?s2?=?s0?+?s1;

字符串比較

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

字符串比較

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

示例代碼:package?com.dashidan.lesson5;/**

*?大屎蛋教程網(wǎng)-dashidan.com

*

*?Java教程基礎(chǔ)篇:?5.?Java變量

*?字符串變量

*/public?class?Demo2?{

public?static?void?main(String[]?args)?{

String?s0?=?"大屎蛋教程網(wǎng)";

String?s1?=?"大屎蛋教程網(wǎng)";

String?s2?=?new?String("大屎蛋教程網(wǎng)");

/**?equal比較字符串內(nèi)容*/

boolean?isSame?=?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?是通過(guò)new的方式從新創(chuàng)建的字符串對(duì)象,s0?s2?指向不同的內(nèi)存地址*/

isSame?=?(s0?==?s2);

System.out.println("4?==?isSame?:?"?+?isSame);

isSame?=?(s0?==?s1);

/**?這里里的賦值,java虛擬機(jī)做了處理,自動(dòng)指向了同一個(gè)字符串*/

System.out.println("5?==?isSame?:?"?+?isSame);

/**?改變字符串?s0*/

s0?+=?"aaa";

/**?s0?發(fā)生變化*/

System.out.println("s0?"?+?s0);

/**?s1?沒(méi)有發(fā)生變化*/

System.out.println("s1?"?+?s1);

/**?字符串s0?發(fā)生改變,虛擬機(jī)自動(dòng)新建了一個(gè)字符串對(duì)象,s0?s1不再指向同一個(gè)字符串*/

isSame?=?(s0?==?s1);

System.out.println("6?==?isSame?:?"?+?isSame);

}}

輸出:1?equals?isSame?:?true

2?equals?isSame?:?true

3?equals?isSame?:?true

4?==?isSame?:?false

5?==?isSame?:?true

s0?大屎蛋教程網(wǎng)aaa

s1?大屎蛋教程網(wǎng)

6?==?isSame?:?false

③ 引用類(lèi)型變量

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

1. 什么是引用

把對(duì)象數(shù)據(jù)比喻為一座房子,引用就是門(mén)牌號(hào). 一個(gè)對(duì)象在內(nèi)存中會(huì)請(qǐng)求一塊內(nèi)存空間來(lái)保存數(shù)據(jù),根據(jù)對(duì)象的大小, 需要占用的空間大小也不等. 訪問(wèn)對(duì)象數(shù)據(jù)時(shí), 不直接訪問(wèn)對(duì)象在內(nèi)存中的數(shù)據(jù), 而是通過(guò)引用去訪問(wèn). 如果我們定義了不止一個(gè)引用指向同一個(gè)對(duì)象, 那么這些引用是不相同的, 因?yàn)橐靡彩且环N數(shù)據(jù)類(lèi)型, 需要一定的內(nèi)存空間(棧空間stack)來(lái)保存. 但是它們的指向的對(duì)象數(shù)據(jù)是相同的, 都指示同一個(gè)對(duì)象在內(nèi)存(堆空間heap)的中位置.

例:String?a="This?is?a?Text!";String?b=a;

a和b是不同的兩個(gè)引用,我們使用了兩個(gè)定義語(yǔ)句來(lái)定義它們. 但它們的值是一樣的, 都指向同一個(gè)對(duì)象 "This is a Text!".如圖:

String對(duì)象的值本身是不可更改的

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

2.引用類(lèi)型

java有3種引用類(lèi)型類(lèi)class

接口interface

數(shù)組array

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

不同的引用可能指向同一個(gè)對(duì)象,換句話說(shuō), 一個(gè)對(duì)象可以有多個(gè)引用, 即該類(lèi)類(lèi)型的變量.

4.引用傳遞

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

④ 變量作用域

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

1. 成員變量

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

2. 局部變量

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

3. 示例代碼package?com.dashidan.lesson5;/**

*?大屎蛋教程網(wǎng)-dashidan.com

*?

*?Java教程基礎(chǔ)篇:?5.?Java變量

*?變量作用域

*/public?class?Demo3?{

/**

*?a,b?是成員變量,整個(gè)方法都可以調(diào)用.

*/

public?static?int?a;

public?static?float?b?=?3.0f;

public?static?void?main(String?args[])?{

/**??在方法中調(diào)用成員變量,?a為默認(rèn)值,?b為設(shè)定值*/

System.out.println(a);

System.out.println(b);

testVar();

/**?這里輸出變量m,?n,編譯代碼時(shí),會(huì)報(bào)錯(cuò),提示沒(méi)有定義變量m,n*/

//System.out.println(m);

//System.out.println(n);

}

public?static?void?testVar()?{

/**m,n?是成員變量,必須初始化賦值.作用域是在這個(gè)方法中.?*/

int?m?=?0;

int?n?=?1;

System.out.println(m);

System.out.println(n);

}}

輸出:0

3.0

0

1

⑤ 相關(guān)文章

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的java不可变量有哪些_5.Java变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。