Java從入門到起飛之變量與運算符詳解
1. 關鍵字
- 定義:被Java語言賦予了特殊含義,用做專門用途的字符串(或單詞)
- HelloWorld案例中,出現(xiàn)的關鍵字有
class
、public
、static
、void
等,這些單詞已經(jīng)被Java定義好了。
- HelloWorld案例中,出現(xiàn)的關鍵字有
- 特點:全部關鍵字都是小寫字母。
- 關鍵字比較多,不需要死記硬背,學到哪里記到哪里即可。
說明:
關鍵字一共
50個
,其中const
和goto
是保留字
(reserved word)。
true
,false
,null
不在其中,它們看起來像關鍵字,其實是字面量,表示特殊的布爾值和空值。
2. 標識符
Java中變量、方法、類等要素命名時使用的字符序列,稱為標識符。
技巧:凡是自己可以起名字的地方都叫標識符。
標識符的命名規(guī)則(必須遵守的硬性規(guī)定):
由26個英文字母大小寫,0-9 ,_或 $ 組成
數(shù)字不可以開頭。
不可以使用關鍵字和保留字,但能包含關鍵字和保留字。
Java中嚴格區(qū)分大小寫,長度無限制。
標識符不能包含空格。
3. 變量
3.1 初識變量
變量的概念:
內(nèi)存中的一個存儲區(qū)域,該區(qū)域的數(shù)據(jù)可以在同一類型范圍內(nèi)不斷變化
變量的構(gòu)成包含三個要素:數(shù)據(jù)類型、變量名、存儲的值
Java中變量聲明的格式:數(shù)據(jù)類型 變量名 = 變量值
變量的作用:用于在內(nèi)存中保存數(shù)據(jù)。
使用變量注意:
- Java中每個變量必須先聲明,后使用。
- 使用變量名來訪問這塊區(qū)域的數(shù)據(jù)。
- 變量的作用域:其定義所在的一對{ }內(nèi)。
- 變量只有在其作用域內(nèi)才有效。出了作用域,變量不可以再被調(diào)用。
- 同一個作用域內(nèi),不能定義重名的變量。
3.2 Java中變量的數(shù)據(jù)類型
Java中變量的數(shù)據(jù)類型分為兩大類:
基本數(shù)據(jù)類型:包括 整數(shù)類型、浮點數(shù)類型、字符類型、布爾類型。
引用數(shù)據(jù)類型:包括數(shù)組、 類、接口、枚舉、注解、記錄。
3.3 變量的使用
3.3.1 步驟1:變量的聲明
格式:數(shù)據(jù)類型 變量名;
//例如: //存儲一個整數(shù)類型的年齡 int age; //存儲一個小數(shù)類型的體重 double weight; //存儲一個單字符類型的性別 char gender; //存儲一個布爾類型的婚姻狀態(tài) boolean marry; //存儲一個字符串類型的姓名 String name; //聲明多個同類型的變量 int a,b,c; //表示a,b,c三個變量都是int類型。
注意:變量的數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型。
3.3.2 步驟2:變量的賦值
給變量賦值,就是把“值”存到該變量代表的內(nèi)存空間中。同時,給變量賦的值類型必須與變量聲明的類型一致或兼容。
變量賦值的語法格式:
變量名 = 值;
舉例1:可以使用合適類型的常量值給已經(jīng)聲明的變量賦值
age = 18; weight = 109; gender = '女';
舉例2:可以使用其他變量或者表達式給變量賦值
int m = 1; int n = m; int x = 1; int y = 2; int z = 2 * x + y;
3:變量可以反復賦值
//先聲明,后初始化 char gender; gender = '女'; //給變量重新賦值,修改gender變量的值 gender = '男'; System.out.println("gender = " + gender);//gender = 男
舉例4:也可以將變量的聲明和賦值一并執(zhí)行
boolean isBeauty = true; String name = "迪麗熱巴";
內(nèi)存結(jié)構(gòu)如圖:
4. 基本數(shù)據(jù)類型介紹
4.1 整數(shù)類型:byte、short、int、long
- Java各整數(shù)類型有固定的表數(shù)范圍和字段長度,不受具體操作系統(tǒng)的影響,以保證Java程序的可移植性。
定義long類型的變量,賦值時需要以"
l
"或"L
"作為后綴。Java程序中變量通常聲明為int型,除非不足以表示較大的數(shù),才使用long。
Java的整型常量默認為 int 型。
4.1.1 補充:計算機存儲單位
**字節(jié)(Byte):**是計算機用于計量存儲容量的基本單位,一個字節(jié)等于8 bit。
**位(bit):**是數(shù)據(jù)存儲的最小單位。二進制數(shù)系統(tǒng)中,每個0或1就是一個位,叫做bit(比特),其中8 bit 就稱為一個字節(jié)(Byte)。
轉(zhuǎn)換關系:
- 8 bit = 1 Byte
- 1024 Byte = 1 KB
- 1024 KB = 1 MB
- 1024 MB = 1 GB
- 1024 GB = 1 TB
4.2 浮點類型:float、double
- 與整數(shù)類型類似,Java 浮點類型也有固定的表數(shù)范圍和字段長度,不受具體操作系統(tǒng)的影響。
- 浮點型常量有兩種表示形式:
- 十進制數(shù)形式。如:5.12 512.0f .512 (必須有小數(shù)點)
- 科學計數(shù)法形式。如:5.12e2 512E2 100E-2
- float:
單精度
,尾數(shù)可以精確到7位有效數(shù)字。很多情況下,精度很難滿足需求。 - double:
雙精度
,精度是float的兩倍。通常采用此類型。 - 定義float類型的變量,賦值時需要以"
f
"或"F
"作為后綴。 - Java 的浮點型
常量默認為double型
。
4.2.1 關于浮點型精度的說明
并不是所有的小數(shù)都能可以精確的用二進制浮點數(shù)表示。二進制浮點數(shù)不能精確的表示0.1、0.01、0.001這樣10的負次冪。
浮點類型float、double的數(shù)據(jù)不適合在不容許舍入誤差的金融計算領域。如果需要精確數(shù)字計算或保留指定位數(shù)的精度,需要使用BigDecimal類。
測試用例:
//測試1:(解釋見章末企業(yè)真題:為什么0.1 + 0.2不等于0.3) System.out.println(0.1 + 0.2);//0.30000000000000004 //測試2: float ff1 = 123123123f; float ff2 = ff1 + 1; System.out.println(ff1); System.out.println(ff2); System.out.println(ff1 == ff2);
4.3 字符類型:char
char 型數(shù)據(jù)用來表示通常意義上“字符”(占2字節(jié))
Java中的所有字符都使用Unicode編碼,故一個字符可以存儲一個字母,一個漢字,或其他書面語的一個字符。
字符型變量的三種表現(xiàn)形式:
**形式1:**使用單引號(’ ')括起來的單個字符。
例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
**形式2:**直接使用
Unicode值
來表示字符型常量:‘\uXXXX
’。其中,XXXX代表一個十六進制整數(shù)。例如:\u0023 表示 ‘#’。
**形式3:**Java中還允許使用
轉(zhuǎn)義字符‘\’
來將其后的字符轉(zhuǎn)變?yōu)樘厥庾址统A俊?/p>例如:char c3 = ‘\n’; // '\n’表示換行符
轉(zhuǎn)義字符 說明 Unicode表示方式 \n
換行符 \u000a \t
制表符 \u0009 \"
雙引號 \u0022 \'
單引號 \u0027 \\
反斜線 \u005c \b
退格符 \u0008 \r
回車符 \u000d char類型是可以進行運算的。因為它都對應有Unicode碼,可以看做是一個數(shù)值。
4.4 布爾類型:boolean
boolean 類型用來判斷邏輯條件,一般用于流程控制語句中:
- if條件控制語句;
- while循環(huán)控制語句;
- for循環(huán)控制語句;
- do-while循環(huán)控制語句;
boolean類型數(shù)據(jù)只有兩個值:true、false,無其它。
- 不可以使用0或非 0 的整數(shù)替代false和true,這點和C語言不同。
- 拓展:Java虛擬機中沒有任何供boolean值專用的字節(jié)碼指令,Java語言表達所操作的boolean值,在編譯之后都使用java虛擬機中的int數(shù)據(jù)類型來代替:true用1表示,false用0表示。——《java虛擬機規(guī)范 8版》
舉例:
boolean isFlag = true; if(isFlag){ //true分支 }else{ //false分支 }
經(jīng)驗之談:
Less is More!建議不要這樣寫:if ( isFlag = = true ),只有新手才如此。關鍵也很容易寫錯成if(isFlag = true),這樣就變成賦值isFlag為true而不是判斷!
老鳥的寫法
是if (isFlag)或者if ( !isFlag)。
5. 基本數(shù)據(jù)類型變量間運算規(guī)則
在Java程序中,不同的基本數(shù)據(jù)類型(只有7種,不包含boolean類型)變量的值經(jīng)常需要進行相互轉(zhuǎn)換。
轉(zhuǎn)換的方式有兩種:自動類型提升和強制類型轉(zhuǎn)換。
5.1 自動類型提升
規(guī)則:將取值范圍?。ɑ蛉萘啃。┑念愋妥詣犹嵘秊槿≈捣秶螅ɑ蛉萘看螅┑念愋?。
基本數(shù)據(jù)類型的轉(zhuǎn)換規(guī)則如圖所示:
(1)當把存儲范圍小的值(常量值、變量的值、表達式計算的結(jié)果值)賦值給了存儲范圍大的變量時
int i = 'A';//char自動升級為int,其實就是把字符的編碼值賦值給i變量了 double d = 10;//int自動升級為double long num = 1234567; //右邊的整數(shù)常量值如果在int范圍呢,編譯和運行都可以通過,這里涉及到數(shù)據(jù)類型轉(zhuǎn)換 //byte bigB = 130;//錯誤,右邊的整數(shù)常量值超過byte范圍 long bigNum = 12345678912L;//右邊的整數(shù)常量值如果超過int范圍,必須加L,顯式表示long類型。否則編譯不通過
(2)當存儲范圍小的數(shù)據(jù)類型與存儲范圍大的數(shù)據(jù)類型變量一起混合運算時,會按照其中最大的類型運算。
int i = 1; byte b = 1; double d = 1.0; double sum = i + b + d;//混合運算,升級為double
(3)當byte,short,char數(shù)據(jù)類型的變量進行算術運算時,按照int類型處理。
byte b1 = 1; byte b2 = 2; byte b3 = b1 + b2;//編譯報錯,b1 + b2自動升級為int char c1 = '0'; char c2 = 'A'; int i = c1 + c2;//至少需要使用int類型來接收 System.out.println(c1 + c2);//113
5.2 強制類型轉(zhuǎn)換
將3.14
賦值到int
類型變量會發(fā)生什么?產(chǎn)生編譯失敗,肯定無法賦值。
int i = 3.14; // 編譯報錯
想要賦值成功,只有通過強制類型轉(zhuǎn)換,將double 類型強制轉(zhuǎn)換成int 類型才能賦值。
規(guī)則:將取值范圍大(或容量大)的類型強制轉(zhuǎn)換成取值范圍?。ɑ蛉萘啃。┑念愋汀?/strong>
自動類型提升是Java自動執(zhí)行的,而強制類型轉(zhuǎn)換是自動類型提升的逆運算,需要我們自己手動執(zhí)行。
轉(zhuǎn)換格式:
數(shù)據(jù)類型1 變量名 = (數(shù)據(jù)類型1)被強轉(zhuǎn)數(shù)據(jù)值; //()中的數(shù)據(jù)類型必須<=變量值的數(shù)據(jù)類型
(1)當把存儲范圍大的值(常量值、變量的值、表達式計算的結(jié)果值)強制轉(zhuǎn)換為存儲范圍小的變量時,可能會損失精度
或溢出
。
int i = (int)3.14;//損失精度 double d = 1.2; int num = (int)d;//損失精度 int i = 200; byte b = (byte)i;//溢出
(2)當某個值想要提升數(shù)據(jù)類型時,也可以使用強制類型轉(zhuǎn)換。這種情況的強制類型轉(zhuǎn)換是沒有風險
的,通常省略。
int i = 1; int j = 2; double bigger = (double)(i/j);
(3)聲明long類型變量時,可以出現(xiàn)省略后綴的情況。float則不同。
long l1 = 123L; long l2 = 123;//如何理解呢? 此時可以看做是int類型的123自動類型提升為long類型 //long l3 = 123123123123; //報錯,因為123123123123超出了int的范圍。 long l4 = 123123123123L; //float f1 = 12.3; //報錯,因為12.3看做是double,不能自動轉(zhuǎn)換為float類型 float f2 = 12.3F; float f3 = (float)12.3;
6 基本數(shù)據(jù)類型與String的運算
6.1 字符串類型:String
- String不是基本數(shù)據(jù)類型,屬于引用數(shù)據(jù)類型
- 使用一對
""
來表示一個字符串,內(nèi)部可以包含0個、1個或多個字符。 - 聲明方式與基本數(shù)據(jù)類型類似。例如:String str = “尚硅谷”;
6.2 運算規(guī)則
1、任意八種基本數(shù)據(jù)類型的數(shù)據(jù)與String類型只能進行連接“+”運算,且結(jié)果一定也是String類型
System.out.println("" + 1 + 2);//12 int num = 10; boolean b1 = true; String s1 = "abc"; String s2 = s1 + num + b1; System.out.println(s2);//abc10true //String s3 = num + b1 + s1;//編譯不通過,因為int類型不能與boolean運算 String s4 = num + (b1 + s1);//編譯通過
2、String類型不能通過強制類型()轉(zhuǎn)換,轉(zhuǎn)為其他的類型
String str = "123"; int num = (int)str;//錯誤的 int num = Integer.parseInt(str);//正確的,后面才能講到,借助包裝類的方法才能轉(zhuǎn)
7. 運算符
運算符是一種特殊的符號,用以表示數(shù)據(jù)的運算、賦值和比較等。
運算符的分類:
- 按照功能分為:算術運算符、賦值運算符、比較(或關系)運算符、邏輯運算符、位運算符、條件運算符、Lambda運算符
分類 | 運算符 |
---|---|
算術運算符(7個) | +、-、*、/、%、++、– |
賦值運算符(12個) | =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^=等 |
比較(或關系)運算符(6個) | >、>=、<、<=、==、!= |
邏輯運算符(6個) | &、|、^、!、&&、|| |
位運算符(7個) | &、|、^、~、<<、>>、>>> |
條件運算符(1個) | (條件表達式)?結(jié)果1:結(jié)果2 |
Lambda運算符(1個) | ->(第18章時講解) |
- 按照操作數(shù)個數(shù)分為:一元運算符(單目運算符)、二元運算符(雙目運算符)、三元運算符 (三目運算符)
分類 | 運算符 |
---|---|
一元運算符(單目運算符) | 正號(+)、負號(-)、++、–、!、~ |
二元運算符(雙目運算符) | 除了一元和三元運算符剩下的都是二元運算符 |
三元運算符 (三目運算符) | (條件表達式)?結(jié)果1:結(jié)果2 |
7.1 算術運算符
7.1.1 基本語法
舉例1:加減乘除模
public class ArithmeticTest1 { public static void main(String[] args) { int a = 3; int b = 4; System.out.println(a + b);// 7 System.out.println(a - b);// -1 System.out.println(a * b);// 12 System.out.println(a / b);// 計算機結(jié)果是0,為什么不是0.75呢? System.out.println(a % b);// 3 //結(jié)果與被模數(shù)符號相同 System.out.println(5%2);//1 System.out.println(5%-2);//1 System.out.println(-5%2);//-1 System.out.println(-5%-2);//-1 //商*除數(shù) + 余數(shù) = 被除數(shù) //5%-2 ==>商是-2,余數(shù)時1 (-2)*(-2)+1 = 5 //-5%2 ==>商是-2,余數(shù)是-1 (-2)*2+(-1) = -4-1=-5 } }
舉例2:“+”號的兩種用法
- 第一種:對于
+
兩邊都是數(shù)值的話,+
就是加法的意思 - 第二種:對于
+
兩邊至少有一邊是字符串的話,+
就是拼接的意思
public class ArithmeticTest2 { public static void main(String[] args) { // 字符串類型的變量基本使用 // 數(shù)據(jù)類型 變量名稱 = 數(shù)據(jù)值; String str1 = "Hello"; System.out.println(str1); // Hello System.out.println("Hello" + "World"); // HelloWorld String str2 = "Java"; // String + int --> String System.out.println(str2 + 520); // Java520 // String + int + int // String + int // String System.out.println(str2 + 5 + 20); // Java520 } }
舉例3:自加自減運算
理解:++
運算,表示自增1
。同理,--
運算,表示自減1
,用法與++ 一致。
1、單獨使用
- 變量在單獨運算的時候,變量
前++
和變量后++
,是沒有區(qū)別的。 - 變量
前++
:例如++a
。 - 變量
后++
:例如a++
。
public class ArithmeticTest3 { public static void main(String[] args) { // 定義一個int類型的變量a int a = 3; //++a; a++; // 無論是變量前++還是變量后++,結(jié)果都是4 System.out.println(a); } }
2、復合使用
- 和其他變量放在一起使用或者和輸出語句放在一起使用,前++和后++就產(chǎn)生了不同。
- 變量前++ :變量先自增1,然后再運算。
- 變量后++ :變量先運算,然后再自增1。
public class ArithmeticTest4 { public static void main(String[] args) { // 其他變量放在一起使用 int x = 3; //int y = ++x; // y的值是4,x的值是4, int y = x++; // y的值是3,x的值是4 System.out.println(x); System.out.println(y); System.out.println("=========="); // 和輸出語句一起 int z = 5; //System.out.println(++z);// 輸出結(jié)果是6,z的值也是6 System.out.println(z++);// 輸出結(jié)果是5,z的值是6 System.out.println(z); } }
7.2 賦值運算符
7.2.1 基本語法
符號:=
- 當“=”兩側(cè)數(shù)據(jù)類型不一致時,可以使用自動類型轉(zhuǎn)換或使用強制類型轉(zhuǎn)換原則進行處理。
- 支持連續(xù)賦值。
擴展賦值運算符: +=、 -=、*=、 /=、%=
賦值運算符 符號解釋 +=
將符號左邊的值和右邊的值進行相加操作,最后將結(jié)果賦值給左邊的變量 -=
將符號左邊的值和右邊的值進行相減操作,最后將結(jié)果賦值給左邊的變量 *=
將符號左邊的值和右邊的值進行相乘操作,最后將結(jié)果賦值給左邊的變量 /=
將符號左邊的值和右邊的值進行相除操作,最后將結(jié)果賦值給左邊的變量 %=
將符號左邊的值和右邊的值進行取余操作,最后將結(jié)果賦值給左邊的變量
public class SetValueTest1 { public static void main(String[] args) { int i1 = 10; long l1 = i1; //自動類型轉(zhuǎn)換 byte bb1 = (byte)i1; //強制類型轉(zhuǎn)換 int i2 = i1; //連續(xù)賦值的測試 //以前的寫法 int a1 = 10; int b1 = 10; //連續(xù)賦值的寫法 int a2,b2; a2 = b2 = 10; int a3 = 10,b3 = 20; //舉例說明+= -= *= /= %= int m1 = 10; m1 += 5; //類似于 m1 = m1 + 5的操作,但不等同于。 System.out.println(m1);//15 //練習1:開發(fā)中,如何實現(xiàn)一個變量+2的操作呢? // += 的操作不會改變變量本身的數(shù)據(jù)類型。其他拓展的運算符也如此。 //寫法1:推薦 short s1 = 10; s1 += 2; //編譯通過,因為在得到int類型的結(jié)果后,JVM自動完成一步強制類型轉(zhuǎn)換,將int類型強轉(zhuǎn)成short System.out.println(s1);//12 //寫法2: short s2 = 10; //s2 = s2 + 2;//編譯報錯,因為將int類型的結(jié)果賦值給short類型的變量s時,可能損失精度 s2 = (short)(s2 + 2); System.out.println(s2); //練習2:開發(fā)中,如何實現(xiàn)一個變量+1的操作呢? //寫法1:推薦 int num1 = 10; num1++; System.out.println(num1); //寫法2: int num2 = 10; num2 += 1; System.out.println(num2); //寫法3: int num3 = 10; num3 = num3 + 1; System.out.println(num3); } }
7.3 比較(關系)運算符
比較運算符的結(jié)果都是boolean型,也就是要么是true,要么是false。
> < >= <= :只適用于基本數(shù)據(jù)類型(除boolean類型之外)
== != :適用于基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
比較運算符“
==
”不能誤寫成“=
”
舉例:
class CompareTest { public static void main(String[] args) { int i1 = 10; int i2 = 20; System.out.println(i1 == i2);//false System.out.println(i1 != i2);//true System.out.println(i1 >= i2);//false int m = 10; int n = 20; System.out.println(m == n);//false System.out.println(m = n);//20 boolean b1 = false; boolean b2 = true; System.out.println(b1 == b2);//false System.out.println(b1 = b2);//true } }
7.4 邏輯運算符
7.4.1 基本語法
邏輯運算符,操作的都是boolean類型的變量或常量,而且運算得結(jié)果也是boolean類型的值。
運算符說明:
- & 和 &&:表示"且"關系,當符號左右兩邊布爾值都是true時,結(jié)果才能為true。否則,為false。
- | 和 || :表示"或"關系,當符號兩邊布爾值有一邊為true時,結(jié)果為true。當兩邊都為false時,結(jié)果為false
- ! :表示"非"關系,當變量布爾值為true時,結(jié)果為false。當變量布爾值為false時,結(jié)果為true。
- ^ :當符號左右兩邊布爾值不同時,結(jié)果為true。當兩邊布爾值相同時,結(jié)果為false。
- 理解:異或,追求的是“異”!
邏輯運算符用于連接布爾型表達式,在Java中不可以寫成 3 < x < 6,應該寫成x > 3 & x < 6 。
區(qū)分“&”和“&&”:
相同點:如果符號左邊是true,則二者都執(zhí)行符號右邊的操作
不同點:& : 如果符號左邊是false,則繼續(xù)執(zhí)行符號右邊的操作
? && :如果符號左邊是false,則不再繼續(xù)執(zhí)行符號右邊的操作
- 建議:開發(fā)中,推薦使用 &&
區(qū)分“|”和“||”:
相同點:如果符號左邊是false,則二者都執(zhí)行符號右邊的操作
不同點:| : 如果符號左邊是true,則繼續(xù)執(zhí)行符號右邊的操作
? || :如果符號左邊是true,則不再繼續(xù)執(zhí)行符號右邊的操作
建議:開發(fā)中,推薦使用 ||
代碼舉例:
public class LoginTest { public static void main(String[] args) { int a = 3; int b = 4; int c = 5; // & 與,且;有false則false System.out.println((a > b) & (a > c)); System.out.println((a > b) & (a < c)); System.out.println((a < b) & (a > c)); System.out.println((a < b) & (a < c)); System.out.println("==============="); // | 或;有true則true System.out.println((a > b) | (a > c)); System.out.println((a > b) | (a < c)); System.out.println((a < b) | (a > c)); System.out.println((a < b) | (a < c)); System.out.println("==============="); // ^ 異或;相同為false,不同為true System.out.println((a > b) ^ (a > c)); System.out.println((a > b) ^ (a < c)); System.out.println((a < b) ^ (a > c)); System.out.println((a < b) ^ (a < c)); System.out.println("==============="); // ! 非;非false則true,非true則false System.out.println(!false); System.out.println(!true); //&和&&的區(qū)別 System.out.println((a > b) & (a++ > c)); System.out.println("a = " + a); System.out.println((a > b) && (a++ > c)); System.out.println("a = " + a); System.out.println((a == b) && (a++ > c)); System.out.println("a = " + a); //|和||的區(qū)別 System.out.println((a > b) | (a++ > c)); System.out.println("a = " + a); System.out.println((a > b) || (a++ > c)); System.out.println("a = " + a); System.out.println((a == b) || (a++ > c)); System.out.println("a = " + a); } }
7.5 位運算符
7.5.1 基本語法
- 位運算符的運算過程都是基于二進制的補碼運算
(1)左移:<<
運算規(guī)則:在一定范圍內(nèi),數(shù)據(jù)每向左移動一位,相當于原數(shù)據(jù)*2。(正數(shù)、負數(shù)都適用)
【注意】當左移的位數(shù)n超過該數(shù)據(jù)類型的總位數(shù)時,相當于左移(n-總位數(shù))位
3<<4 類似于 3*2的4次冪 => 3*16 => 48
-3<<4 類似于 -3*2的4次冪 => -3*16 => -48
(2)右移:>>
運算規(guī)則:在一定范圍內(nèi),數(shù)據(jù)每向右移動一位,相當于原數(shù)據(jù)/2。(正數(shù)、負數(shù)都適用)
【注意】如果不能整除,向下取整。
69>>4 類似于 69/2的4次 = 69/16 =4
-69>>4 類似于 -69/2的4次 = -69/16 = -5
(3)無符號右移:>>>
運算規(guī)則:往右移動后,左邊空出來的位直接補0。(正數(shù)、負數(shù)都適用)
69>>>4 類似于 69/2的4次 = 69/16 =4
-69>>>4 結(jié)果:268435451
(4)按位與:&
運算規(guī)則:對應位都是1才為1,否則為0。
1 & 1 結(jié)果為1
1 & 0 結(jié)果為0
0 & 1 結(jié)果為0
0 & 0 結(jié)果為0
9 & 7 = 1
-9 & 7 = 7
(5)按位或:|
運算規(guī)則:對應位只要有1即為1,否則為0。
1 | 1 結(jié)果為1
1 | 0 結(jié)果為1
0 | 1 結(jié)果為1
0 & 0 結(jié)果為0
9 | 7 //結(jié)果: 15
-9 | 7 //結(jié)果: -9
(6)按位異或:^
運算規(guī)則:對應位一個為1一個為0,才為1,否則為0。
1 ^ 1 結(jié)果為0
1 ^ 0 結(jié)果為1
0 ^ 1 結(jié)果為1
0 ^ 0 結(jié)果為0
9 ^ 7 //結(jié)果為14
-9 ^ 7 //結(jié)果為-16
(7)按位取反:~
運算規(guī)則:對應位為1,則結(jié)果為0;對應位為0,則結(jié)果為1。
~0就是1
~1就是0
~9 //結(jié)果:-10
~-9 //結(jié)果:8
7.6 條件運算符
7.6.1 基本語法
- 條件運算符格式:
(條件表達式)? 表達式1:表達式2
說明:條件表達式是boolean類型的結(jié)果,根據(jù)boolean的值選擇表達式1或表達式2
如果運算后的結(jié)果賦給新的變量,要求表達式1和表達式2為同種或兼容的類型
public static void main(String[] args) { int i = (1==2 ? 100 : 200); System.out.println(i);//200 boolean marry = false; System.out.println(marry ? "已婚" : "未婚" ); double d1 = (m1 > m2)? 1 : 2.0; System.out.println(d1); int num = 12; System.out.println(num > 0? true : "num非正數(shù)"); }
7.6.2 與if-else的轉(zhuǎn)換關系
凡是可以使用條件運算符的地方,都可以改寫為if-else結(jié)構(gòu)。反之,不成立。
開發(fā)中,如果既可以使用條件運算符,又可以使用if-else,推薦使用條件運算符。因為執(zhí)行效率稍高。
//if-else實現(xiàn)獲取兩個數(shù)的較大值 int i1 = 10; int i2 = 20; int max;//聲明變量max,用于記錄i1和i2的較大值 if(i1 > i2){ max = i1; }else{ max = i2; } System.out.println(max);
7.7 運算符優(yōu)先級
運算符有不同的優(yōu)先級,所謂優(yōu)先級就是在表達式運算中的運算符順序。
上一行中的運算符總是優(yōu)先于下一行的。
優(yōu)先級 | 運算符說明 | Java運算符 |
---|---|---|
1 | 括號 | () 、[] 、{} |
2 | 正負號 | + 、- |
3 | 單元運算符 | ++ 、-- 、~ 、! |
4 | 乘法、除法、求余 | * 、/ 、% |
5 | 加法、減法 | + 、- |
6 | 移位運算符 | << 、>> 、>>> |
7 | 關系運算符 | < 、<= 、>= 、> 、instanceof |
8 | 等價運算符 | == 、!= |
9 | 按位與 | & |
10 | 按位異或 | ^ |
11 | 按位或 | ` |
12 | 條件與 | && |
13 | 條件或 | ` |
14 | 三元運算符 | ? : |
15 | 賦值運算符 | = 、+= 、-= 、*= 、/= 、%= |
16 | 位賦值運算符 | &= 、` |
開發(fā)建議:
不要過多的依賴運算的優(yōu)先級來控制表達式的執(zhí)行順序,這樣可讀性太差,盡量使用()來控制表達式的執(zhí)行順序。
不要把一個表達式寫得過于復雜,如果一個表達式過于復雜,則把它分成幾步來完成。例如:
? (num1 + num2) * 2 > num3 && num2 > num3 ? num3 : num1 + num2;
總結(jié)
到此這篇關于Java變量與運算符詳解的文章就介紹到這了,更多相關Java變量與運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中synchronized?的4個優(yōu)化技巧
本文主要介紹了Java中synchronized的4個優(yōu)化技巧,synchronized在JDK?1.5?時性能是比較低的,然而在后續(xù)的版本中經(jīng)過各種優(yōu)化迭代,它的性能也得到了前所未有的提升,下文更多相關資料需要的小伙伴可以參考一下2022-05-05SpringCloud服務實現(xiàn)同時使用eureka和nacos方法
這篇文章主要介紹了SpringCloud服務實現(xiàn)同時使用eureka和nacos方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01使用Java對數(shù)據(jù)庫進行基本的查詢和更新操作
這篇文章主要介紹了使用Java對數(shù)據(jù)庫進行基本的查詢和更新操作,是Java入門學習中的基礎知識,需要的朋友可以參考下2015-10-10Spring、SpringMvc和SpringBoot的區(qū)別及說明
Spring框架提供了全面的Java開發(fā)解決方案,核心包括IOC和AOP,SpringMvc作為其中的WEB層開發(fā)框架,通過復雜的XML配置管理前端視圖和后臺邏輯,SpringBoot則簡化了配置,專注于微服務接口開發(fā),支持嵌入式服務器,提高了開發(fā)效率2024-10-10