日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

5.Java變量

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

① 基礎(chǔ)類型變量

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

1. 數(shù)字類型變量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億之間,超過這個(gè)范圍需要采用long類型.int?i0?=?100000;int?i1?=?-2;long?長整型變量,表示整數(shù),取值范圍(-2^64到2^64-1),不支持小數(shù).long?l0?=?100000L;long?l1?=?-3L;float?浮點(diǎn)數(shù)類型,表示小數(shù),取值范圍(到).浮點(diǎn)數(shù)有舍入誤差.

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

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

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

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

java默認(rèn)值

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

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

計(jì)算機(jī)存儲(chǔ)×××數(shù)據(jù)是以二進(jìn)制方式存儲(chǔ),有符號(hào)數(shù)據(jù)類型(byte, short, int, long, float)最小值為`-2^n`,最大值為`2^-1`,`n`為占用字節(jié)數(shù).無符號(hào)類型(char)最小值為0,最大值為2^16(65535). 存儲(chǔ)浮點(diǎn)類型數(shù)據(jù)表示范圍太大,采用科學(xué)計(jì)數(shù)法方式存儲(chǔ),所以范圍會(huì)整數(shù)型大很多.Java數(shù)字類型變量默認(rèn)值和取值范圍類型默認(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)制無法精確表示分?jǐn)?shù)1/10,就像十進(jìn)制無法精確表示1/3一樣.如果需要在數(shù)值計(jì)算中不含有舍入誤差,應(yīng)該使用BigDecimal類.

2. 布爾類型變量

boolean(布爾類型),只有兩個(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ǔ)類型變量

*/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

② 字符串類型變量

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

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ì)引起很嚴(yán)重的安全問題.譬如,數(shù)據(jù)庫的用戶名、密碼都是以字符串的形式傳入來獲得數(shù)據(jù)庫的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入, 這個(gè)值如果被修改, 將會(huì)帶來很嚴(yán)重的安全隱患.

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

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

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

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

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

字符串賦值

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

獲取字符串長度

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

字符相加

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

字符串比較

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

字符串比較

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

③ 引用類型變量

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

1. 什么是引用

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

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

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

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

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

2.引用類型

java有3種引用類型類class

接口interface

數(shù)組array

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

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

4.引用傳遞

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

④ 變量作用域

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

1. 成員變量

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

2. 局部變量

方法內(nèi)定義的變量被稱為局部變量,局部變量沒有默認(rèn)值,聲明變量時(shí)必須設(shè)定初始值. 作用范圍從聲明開始,直到包含它的塊(對(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,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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。