第一章 數(shù)據(jù)類型轉(zhuǎn)換
java程序中要求參與的計(jì)算的數(shù)據(jù),必須要保證數(shù)據(jù)類型的一致性,如果數(shù)據(jù)類型不一致將發(fā)生類型的轉(zhuǎn)換。
1.1 自動(dòng)轉(zhuǎn)換
一個(gè)int類型變量和一個(gè)byte類型變量進(jìn)行加法運(yùn)算,結(jié)果會(huì)是什么數(shù)據(jù)類型?
int i = 1;
byte b = 2;
運(yùn)算結(jié)果,變量的類型將是int類型,這就是出現(xiàn)了數(shù)據(jù)類型的自動(dòng)類型轉(zhuǎn)換現(xiàn)象。
- 自動(dòng)轉(zhuǎn)換:將取值范圍小的類型自動(dòng)提升為取值范圍大的類型。
public static void main(String[] args) {
int i = 1;
byte b = 2;
// byte x = b + i; // 報(bào)錯(cuò)
//int 類型和 byte 類型運(yùn)算,結(jié)果是 int 類型
int j = b + i;
System.out.println(j);
}
轉(zhuǎn)換原理圖解
byte類型內(nèi)存占有1個(gè)字節(jié)闰非,在和int類型運(yùn)算時(shí)會(huì)提升為int類型,自動(dòng)補(bǔ)充3個(gè)字節(jié)纱控,因此計(jì)算后的結(jié)果還是int類 型舶掖。
同樣道理,當(dāng)一個(gè)int類型變量和一個(gè)double變量運(yùn)算時(shí),int類型將會(huì)自動(dòng)提升為double類型進(jìn)行運(yùn)算雏蛮。
public static void main(String[] args){
int i = 1;
double d = 2.5;
//int類型和double類型運(yùn)算衷模,結(jié)果是double類型
//int類型會(huì)提升為double類型
double e = d+i;
System.out.println(e);
}
轉(zhuǎn)換規(guī)則
范圍小的類型向范圍大的類型提升木蹬,byte走触、short惫皱、char運(yùn)算時(shí)直接提升為int涂滴。
byte、 short段多、 char-->int-->long--float-->double
1.2 強(qiáng)制轉(zhuǎn)換
將1.5賦值到int類型變量會(huì)發(fā)生什么首量?產(chǎn)生編譯失敗,肯定無(wú)法賦值。
int i = 1.5; // 錯(cuò)誤
double類型內(nèi)存8個(gè)字節(jié)加缘,int類型內(nèi)存4個(gè)字節(jié)鸭叙。1.5是double類型,取值范圍大于int拣宏∩虮矗可以理解為double是8 升的水壺,int是4升的水壺勋乾,不能把大水壺中的水直接放進(jìn)小水壺去宋下。
想要賦值成功,只有通過(guò)強(qiáng)制類型轉(zhuǎn)換辑莫,將double類型強(qiáng)制轉(zhuǎn)換成int類型才能賦值学歧。
- 強(qiáng)制類型轉(zhuǎn)換:將取值范圍大的類型強(qiáng)制轉(zhuǎn)換成取值范圍小的類型。
比較而言各吨,自動(dòng)轉(zhuǎn)換是Java自動(dòng)執(zhí)行的枝笨,而強(qiáng)制轉(zhuǎn)換需要我們自己手動(dòng)執(zhí)行。
轉(zhuǎn)換格式:
數(shù)據(jù)類型 變量名 = (數(shù)據(jù)類型)被轉(zhuǎn)數(shù)據(jù)值揭蜒;
將1.5賦值到int類型横浑,代碼修改為:
// double類型數(shù)據(jù)強(qiáng)制轉(zhuǎn)成int類型,直接去掉小數(shù)點(diǎn)屉更。
int i = (int)1.5;
同樣道理徙融,當(dāng)一個(gè)short類型與1相加,我們知道會(huì)類型提升偶垮,但是還想給結(jié)果賦值給short類型變量张咳,就需要強(qiáng)制轉(zhuǎn)換。
public static void main(String[] args) {
//short類型變量似舵,內(nèi)存中2個(gè)字節(jié)
short s = 1;
/*
出現(xiàn)編譯失敗
s和1做運(yùn)算的時(shí)候,1是int類型葱峡,s會(huì)被提升為int類型
s+1后的結(jié)果是int類型砚哗,將結(jié)果在賦值會(huì)short類型時(shí)發(fā)生錯(cuò)誤
short內(nèi)存2個(gè)字節(jié),int類型4個(gè)字節(jié)
必須將int強(qiáng)制轉(zhuǎn)成short才能完成賦值
*/
s = s + 1砰奕; //編譯失敗
s = (short)(s+1);//編譯成功
}
轉(zhuǎn)換原理圖解
強(qiáng)烈注意
浮點(diǎn)轉(zhuǎn)成整數(shù)蛛芥,直接取消小數(shù)點(diǎn),可能造成數(shù)據(jù)損失精度军援。
int強(qiáng)制轉(zhuǎn)成short砍掉2個(gè)字節(jié)仅淑,可能造成數(shù)據(jù)丟失。
//定義s為short范圍內(nèi)最大值
short s = 32767;
// 運(yùn)算后胸哥,強(qiáng)制轉(zhuǎn)換涯竟,砍掉2個(gè)字節(jié)后會(huì)出現(xiàn)不確定的結(jié)果
s = (short)(s + 10);
1.3 ASCII編碼表
public static void main(String[] args) {
//字符類型變量
char c = 'a';
int i = 1;
//字符類型和int類型計(jì)算
System.out.println(c+i); //輸出結(jié)果是98
}
在計(jì)算機(jī)的內(nèi)部都是二進(jìn)制的0、1 數(shù)據(jù),如何讓計(jì)算機(jī)可以直接識(shí)別人類文字的問(wèn)題呢庐船?就產(chǎn)生出了編碼表的概念
- 編碼表:就是將人類的文字和一個(gè)十進(jìn)制數(shù)進(jìn)行對(duì)應(yīng)起來(lái)組成一張表格银酬。
人們就規(guī)定:
字符 | 數(shù)值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
- 將所有的英文字母,數(shù)字筐钟,符號(hào)都和十進(jìn)制進(jìn)行了對(duì)應(yīng)揩瞪,因此產(chǎn)生了世界上第一張編碼表ASCII (
American Standard Code for Information Interchange 美國(guó)標(biāo)準(zhǔn)信息交換碼)。 - 各個(gè)國(guó)家都有自己字符篓冲,所有都要有自己的編碼表李破,其中中國(guó)的編碼表GB2312,GBK,其中都是中國(guó)的漢字壹将,GBK編碼表前面的數(shù)字都是和ASCII表中的內(nèi)容相同喷屋,GBK編碼表中,英文使用的是一個(gè)字節(jié)表示瞭恰,中文使用的兩個(gè)字節(jié)
- 各個(gè)國(guó)家都有自己的編碼表屯曹。出現(xiàn)了一個(gè)統(tǒng)一碼,Unicode惊畏,使用2個(gè)字節(jié)來(lái)表示一個(gè)字符恶耽,共能表示65536個(gè),可以表示世界上所有的字符颜启,java語(yǔ)言在內(nèi)存中表示字符偷俭,使用的就是Unicode編碼
- UTF-8編碼形式,可變長(zhǎng)編碼缰盏,使用1個(gè)字節(jié)表示英文字母涌萤,3個(gè)字節(jié)表示一個(gè)漢字
- 總結(jié):
在內(nèi)存中一般使用Unicode編碼,在磁盤或者網(wǎng)絡(luò)中使用GBK或者UTF-8口猜,無(wú)論是GBK還是UTF-8還是Unicode統(tǒng)統(tǒng)都是兼容ASCII碼表负溪,在任意一個(gè)碼表中,對(duì)應(yīng)的英文字符济炎,都是相同的川抡。 - java中表示字符使用的Unicode編碼,所以可以使用Unicode碼值去表示一個(gè)字符须尚,表示格式‘\uxxxx’
\u代表的是Unicode中字符的一種形式崖堤,xxxx表示使用的4個(gè)16進(jìn)制的數(shù)字。
class DataTypeDemo {
public static void main(String[] args) {
//ASCII碼表
//字符和數(shù)字的對(duì)應(yīng)關(guān)系
//根據(jù)數(shù)字打印ASCII中的字符
System.out.println((char)3);
//根據(jù)字符獲取一下ASCII碼表中對(duì)應(yīng)的數(shù)字
System.out.println((int)'a');
System.out.println('a' + 0);
//unicode碼值耐床,使用\u跟上四個(gè)十六進(jìn)制數(shù)的表示
System.out.println('\u7788');
}
}
小貼士:
在char類型和int類型計(jì)算的過(guò)程中密幔,char類型的字符先查詢編碼表,得到97,再和1求和撩轰,結(jié)果為98胯甩。char類型提升 為了int類型昧廷。char類型內(nèi)存2個(gè)字節(jié),int類型內(nèi)存4個(gè)字節(jié)蜡豹。
第二章 運(yùn)算符
運(yùn)算符時(shí)用于運(yùn)算和操作數(shù)據(jù)的符號(hào)麸粮。
2.1 算數(shù)運(yùn)算符
算數(shù)運(yùn)算符包括: | - |
---|---|
+ | 加法運(yùn)算,字符串連接運(yùn)算 |
- | 減法運(yùn)算 |
* | 乘法運(yùn)算 |
/ | 除法運(yùn)算(求商) |
% | 取模運(yùn)算镜廉,兩個(gè)數(shù)字相除取余數(shù) |
++ 弄诲、 -- | 自增自減運(yùn)算 |
Java中,整數(shù)使用以上運(yùn)算符娇唯,無(wú)論怎么計(jì)算齐遵,也不會(huì)得到小數(shù)。
取余的結(jié)果的符號(hào)只能%前面的操作數(shù)有關(guān)
作用:判斷一個(gè)數(shù)能否被整數(shù)塔插,判斷奇偶
public static void main(String[] args) {
int i = 1234;
System.out.println(i/1000*1000);//計(jì)算結(jié)果是 1000
}
-
++運(yùn)算梗摇,變量自己增長(zhǎng)1。反之想许,--運(yùn)算伶授,變量自己減少1,用法與++一致。
-
獨(dú)立運(yùn)算:
- 變量在獨(dú)立運(yùn)算時(shí)流纹,前++和后++沒(méi)有區(qū)別糜烹。
- 變量前++ :例如++i。
- 變量后++ :例如i++漱凝。
-
混合運(yùn)算:
和其他變量放在一起疮蹦,前++和后++就產(chǎn)生了不同。
變量前++ :變量a自己加1,將加1后的結(jié)果賦值給b,也就是說(shuō)a先計(jì)算茸炒。a和b的結(jié)果都是2愕乎。
變量后++ :變量a先把自己的值1,賦值給變量b,此時(shí)變量b的值就是1,變量a自己再加1壁公。a的結(jié)果是2, b 的結(jié)果是1感论。
-
//變量前++
public static void main(String[] args) {
int a = 1;
int b = ++a;
System.out. println( a); //計(jì)算結(jié)果是 2
System.out. println (b); //計(jì)算結(jié)果是 2
}
//變量后++
public static void main(String[] args) {
int a = 1;
int b = a++;
System.out. println( a); //計(jì)算結(jié)果是 2 System.out. pri ntln (b); //計(jì)算結(jié)果是 1
}
-
+符號(hào)在字符串中的操作:
- +符號(hào)在遇到字符串的時(shí)彳唉,表示連接贮尖、拼接的含義笛粘。
- "a"+"b"的結(jié)果是"ab",連接含義
public static void main(String[] args){
System.out.println("5+5="+5+5);//輸出 5+5=55
}
2.2 賦值運(yùn)算符
分類:
- 基本的賦值運(yùn)算符: =
- 擴(kuò)展的運(yùn)算符: += 湿硝,-= ,*=润努,/= 关斜,%=
賦值運(yùn)算符包括: | - |
---|---|
= | 等于號(hào) |
+= | 加等于 |
-= | 減等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取模等 |
- 基本賦值運(yùn)算符
就是將符號(hào)右邊的值,賦給左邊的變量铺浇。 - 擴(kuò)展的賦值運(yùn)算符
將符號(hào)左右兩側(cè)的數(shù)據(jù)進(jìn)行算數(shù)運(yùn)算痢畜,將結(jié)果賦值給符號(hào)左邊的變量
public static void main(String[] args){
int i = 5;
i+=5;//計(jì)算方式i=i+5變量i先加5,再賦值變量i
System.out.println(i); //輸出結(jié)果是10
}
2.3 比較運(yùn)算符
比較運(yùn)算符包括: | - |
---|---|
== | 比較符號(hào)兩邊數(shù)據(jù)是否相等,相等結(jié)果是true丁稀。 |
< | 比較符號(hào)左邊的數(shù)據(jù)是否小于右邊的數(shù)據(jù)吼拥,如果小于結(jié)果是true。 |
> | 比較符號(hào)左邊的數(shù)據(jù)是否大于右邊的數(shù)據(jù)线衫,如果大于結(jié)果是true凿可。 |
<= | 比較符號(hào)左邊的數(shù)據(jù)是否小于或者等于右邊的數(shù)據(jù),如果小于結(jié)果是true授账。 |
>= | 比較符號(hào)左邊的數(shù)據(jù)是否大于或者等于右邊的數(shù)據(jù)枯跑,如果小于結(jié)果是true。 |
!= | 不等于符號(hào)白热,如果符號(hào)兩邊的數(shù)據(jù)不相等敛助,結(jié)果是true。 |
- 比較運(yùn)算符屋确,是兩個(gè)數(shù)據(jù)之間進(jìn)行比較的運(yùn)算纳击,運(yùn)算結(jié)果都是布爾值true或者false。
public static void main(String[] args) {
System.out.println(1==1);//true
System.out.println(1<2);//true
System.out.println(3>4);//false
System.out.println(3<=4);//true
System.out.println(3>=4);//false
System.out.println(3!=4);//true
}
2.4 邏輯運(yùn)算符
分類:
- 普通的邏輯運(yùn)算符 & 攻臀、 | 焕数、 ^、 !
- 短路的邏輯運(yùn)算符 && 茵烈、 ||
邏輯運(yùn)算符包括: | - |
---|---|
&&短路與 | 1. 兩邊都是true百匆,結(jié)果是true 2. —邊是false,結(jié)果是false 短路特點(diǎn):符號(hào)左邊是false呜投,右邊不再運(yùn)算 |
II短路或 | 1. 兩邊都是false加匈,結(jié)果是false 2. —邊是true,結(jié)果是true 短路特點(diǎn):符號(hào)左邊是true仑荐,右邊不再運(yùn)算 |
! 取反 | 1. ! true 結(jié)果是 false 2. ! false 結(jié)果是 true |
^ 異或 | 相同為假雕拼,不同為真 |
- 邏輯運(yùn)算符,是用來(lái)連接兩個(gè)布爾類型結(jié)果的運(yùn)算符粘招,運(yùn)算結(jié)果都是布爾值true或者false
class LogicalSignDemo{
public static void main(String[] args) {
//邏輯與
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(false & true);//false
System.out.println(false & false);//false
System.out.println(12 & 10);//8 //進(jìn)行按位與運(yùn)算啥寇,相同為1不同為0
//12 1100
//10 1010
// 8 1000
//邏輯或
System.out.println(true || true);//true
System.out.println(true | false);//true
System.out.println(false | true);//true
System.out.println(false | false);//false
System.out.println(12 | 10);//12 //按位或操作,全0為0洒扎,否則為1
//12 1100
//10 1010
//14 1110
//邏輯異或
System.out.println(true ^ true);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true
System.out.println(false ^ false);//false
System.out.println(12 ^ 10 ^ 10);//異或一個(gè)數(shù)據(jù)兩次之后辑甜,返回的還是該數(shù)據(jù)本身
//12 1100 //12和10異或的結(jié)果是6,6與再與10異或又回到了12本身
//10 1010
//6 0110
// 10 1010
// 12 1100
//邏輯非
System.out.println(!true);
System.out.println(!false);
//短路與和短路或
//短路與和短路或是不能對(duì)數(shù)字進(jìn)行按位與操作
// 短路與
int a = 10;
boolean boo1 = (a > 20) & (++a > 10);//普通的與即使第一個(gè)表達(dá)式為false,也會(huì)計(jì)算第二個(gè)表達(dá)式的結(jié)果
System.out.println(a);//11
int aa = 10;//短路與在進(jìn)行計(jì)算時(shí)袍冷,如果第一個(gè)表達(dá)式的結(jié)果為false磷醋,那么就不計(jì)算第二個(gè)表達(dá)式了
boolean boo11 = (aa > 20) && (++aa > 10);
System.out.println(aa);//10
// 短路或
int b = 10;
boolean boo2 = (b > 9) | (++b > 10);//普通的或即使第一個(gè)表達(dá)式為true,也會(huì)計(jì)算第二個(gè)表達(dá)式的結(jié)果
System.out.println(b);//11
int bb = 10;
boolean boo22 = (bb > 9) || (++bb > 10);//短路或在進(jìn)行計(jì)算時(shí)胡诗,如果第一個(gè)表達(dá)式的結(jié)果為true邓线,那么就不計(jì)算第二個(gè)表達(dá)式了
System.out.println(bb);//10
}
}
2.5 三元運(yùn)算符
- 三元運(yùn)算符格式:
數(shù)據(jù)類型 變量名 = 布爾類型表達(dá)式 ? 結(jié)果1 : 結(jié)果2
- 三元運(yùn)算符計(jì)算方式:
- 布爾類型表達(dá)式結(jié)果是true淌友,三元運(yùn)算符整體結(jié)果為結(jié)果1,賦值給變量骇陈。
- 布爾類型表達(dá)式結(jié)果是false震庭,三元運(yùn)算符整體結(jié)果為結(jié)果2,賦值給變量。
class TernaryOperatorDemo{
public static void main(String[] args) {
//三元運(yùn)算符
System.out.println(9 == 9 ? 9 + 1 : "不相等");
int i = 10;
int j = 3;
System.out.println(i < j ? i : j);
//注意:
int m = 520;
int n = 100;
// m > n ? "大于" : "小于";//三元表達(dá)式?jīng)]有變量進(jìn)行接收數(shù)據(jù)的時(shí)候你雌,是不能單獨(dú)存在的
//"大于";
//System.out.println(m > n ? "大于" : "小于");
//如果表達(dá)式2和表達(dá)式3的數(shù)據(jù)類型不一致器联,那么不能定義一個(gè)變量去接受該三元表達(dá)式的結(jié)果
//char c = m > n ? '大' : false ;
char c = m > n ? '大' : '小' ;
System.out.println(c);
//比較三個(gè)數(shù)的最大值,返回的是三個(gè)數(shù)中最大值
int x = 123;
int y = 456;
int z = 789;
//先求出x和y的最大值
int maxXy = x > y ? x : y;
//將maxXy和z進(jìn)行比較
//int max = maxXy > z ? maxXy : z;
int max = (x > y ? x : y) > z ? (x > y ? x : y) : z;
System.out.println("最大值為" + max);
}
}
第三章方法入門
3.1 概述
我們?cè)趯W(xué)習(xí)運(yùn)算符的時(shí)候匪蝙,都為每個(gè)運(yùn)算符單獨(dú)的創(chuàng)建一個(gè)新的類和main方法主籍,我們會(huì)發(fā)現(xiàn)這樣編寫代碼非常的繁瑣,而且 重復(fù)的代碼過(guò)多逛球。能否避免這些重復(fù)的代碼呢千元,就需要使用方法來(lái)實(shí)現(xiàn)。
- 方法:就是將一個(gè)功能抽取出來(lái)颤绕,把代碼單獨(dú)定義在一個(gè)大括號(hào)內(nèi)幸海,形成一個(gè)單獨(dú)的功能。 當(dāng)我們需要這個(gè)功能的時(shí)候奥务,就可以去調(diào)用物独。這樣即實(shí)現(xiàn)了代碼的復(fù)用性,也解決了代碼冗余的現(xiàn)象氯葬。
3.2 方法的定義
- 定義格式:
修飾符 返回值類型 方法名(參數(shù)列表){
代碼 ...
return ;
}
-
定義格式解釋:
修飾符:目前固定寫法public static挡篓。
返回值類型:目前固定寫法void。
方法名:為我們定義的方法起名帚称,滿足標(biāo)識(shí)符的規(guī)范官研,用來(lái)調(diào)用方法。
參數(shù)列表:目前無(wú)參數(shù)闯睹,帶有參數(shù)的方法在后面的課程講解戏羽。
return:方法結(jié)束。因?yàn)榉祷刂殿愋褪莢oid楼吃,方法大括號(hào)內(nèi)的return可以不寫始花。
舉例:
public static void methodName() {
System.out.println("這是一個(gè)方法");
}
3.3 方法的調(diào)用
方法在定義完畢后孩锡,方法不會(huì)自己運(yùn)行酷宵,必須被調(diào)用才能執(zhí)行,我們可以在主方法main中來(lái)調(diào)用我們自己定義好的方法躬窜。在主方法中忧吟,直接寫要調(diào)用的方法名字就可以調(diào)用了。
public static void main(String[] args) {
//調(diào)用定義的方法method
method()斩披;
}
//定義方法溜族,被main方法調(diào)用
public static void method() {
System.out.println("自己定義的方法,需要被main調(diào)用運(yùn)行");
}
3.4 調(diào)用練習(xí)
將三元運(yùn)算符代碼抽取到自定義的方法中垦沉,并調(diào)用煌抒。
public static void main(String[] args) {
//調(diào)用定義的方法operator
operator();
}
//定義方法,方法中定義三元運(yùn)算符
public static void operator() {
int i = 0;
i = (1==2 ? 100:200);
System.out.println(i);
int j = 0 ;
j = (3<=4 ? 500:600);
System.out.println(j);
}
3.5 注意事項(xiàng)
-
方法定義注意事項(xiàng):
方法必須定義在一類中方法夕卜
方法不能定義在另一個(gè)方法的里面
public class Demo {
public static void main(String[] args){
}
//正確寫法厕倍,類中寡壮,main方法外面可以定義方法
public static void method(){}
}
public class Demo {
public static void main(String[] args){
//錯(cuò)誤寫法,一個(gè)方法不能定義在另一方法內(nèi)部
public static void method(){}
}
}
第四章JShell腳本工具
JShell腳本工具是JDK9的新特性
什么時(shí)候會(huì)用到JShell工具呢讹弯,當(dāng)我們編寫的代碼非常少的時(shí)候况既,而又不愿意編寫類,main方法组民,也不愿意去編譯和運(yùn)行,這個(gè)時(shí)候可以使用JShell工具棒仍。
啟動(dòng)JShell工具,在DOS命令行直接輸入JShell命令臭胜。
接下來(lái)可以編寫Java代碼莫其,無(wú)需寫類和方法,直接寫方法中的代碼即可耸三,同時(shí)無(wú)需編譯和運(yùn)行乱陡,直接回車即可
小貼士:
JShell工具,只適合片段代碼的測(cè)試仪壮,開(kāi)發(fā)更多內(nèi)容憨颠,建議編寫在方法中。
第五章擴(kuò)展知識(shí)點(diǎn)
5.1 +=符號(hào)的擴(kuò)展
下面的程序有問(wèn)題嗎积锅?
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析:s += 1邏輯上看作是s = s + 1計(jì)算結(jié)果被提升為int類型爽彤,再向short類型賦值時(shí)發(fā)生錯(cuò)誤,因?yàn)椴荒軐⑷≈捣秶蟮念愋唾x值到取值范圍小的類型乏沸。但是淫茵,s=s+1進(jìn)行兩次運(yùn)算,+=是一個(gè)運(yùn)算符蹬跃,只運(yùn)算一次匙瘪,并帶有強(qiáng)制轉(zhuǎn)換的特點(diǎn),也就是說(shuō)s += 1就是s = (short)(s + 1),因此程序沒(méi)有問(wèn)題編譯通過(guò),運(yùn)行結(jié)果是2.
5.2 常量和變量的運(yùn)算
下面的程序有問(wèn)題嗎蝶缀?
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);
System.out.println(b4);
}
分析:b3 = 1 + 2丹喻,1和2是常量,為固定不變的數(shù)據(jù)翁都,在編譯的時(shí)候(編譯器javac)碍论,已經(jīng)確定了 1+2的結(jié)果并沒(méi)有超過(guò)byte類型的取值范圍,可以賦值給變量b3柄慰,因此b3 = 1 + 2是正確的鳍悠。
反之税娜,b4 = b2 + b3,b2和b3是變量藏研,變量的值是可能變化的敬矩,在編譯的時(shí)候,編譯器javac不確定b2+b3的結(jié)果是什 么蠢挡,因此會(huì)將結(jié)果以int類型進(jìn)行處理弧岳,所以int類型不能賦值給byte類型,因此編譯失敗业踏。
在jshell中體現(xiàn):