JavaSE之變數、資料型別、運算子、流程控制
一、變數
1.什麼是變數?
- 記憶體中的一塊儲存空間,是儲存資料的容器且只能存一個值,因為存在在其中的資料可以改變所以稱之為變數。
2.語法格式
- 資料型別 變數名;比如 int age;
- 其中變數名時記憶體空間的地址名,資料型別可以是基本資料型別也可以是引用資料型別。
3.Java中變數的特點(Java是強資料型別的語言)
- 先宣告變數型別,再賦值,且賦值的型別一定與宣告的型別要一致。
4.使用注意
- 同一作用域內,變數不能重名;
- 區域性變數必須初始化後才能使用,否則編譯報錯。
5.Java識別符號命名規則及規範
規則
- 由字母、數字、下劃線或$符組成;
- 首位不能使用數字;
- 不能使用Java的關鍵字;
- 不能是用字面值,比如true,false,null。
規範
- 駝峰法則
6.兩個變數交換值的演算法
三種方法:引入中間變數,加減取值法,異或取值法
int a = 1;
int b = 2;
//方法一:引入中間變數
int temp = a;
a = b;
b = temp;
//方法二:加減取值法
a = a + b;
b = a - b;//a + b - b = a
a = a - b;//a + b - a = b
//方法三:異或取值法
a = a ^ b;
b = a ^ b;//a ^ b ^ b = a
a = a ^ b;//a ^ b ^ a = b
二、資料型別
1.分類
基本型別:整型、浮點型、字元型和布林型別
引用型別:陣列、字串、類和介面
2.基本資料型別對比
- 型別 識別符號 記憶體大小 取值範圍
- 位元組型 byte 1位元組 -128-127,即2^7到2^7-1
- 短整型 short 2位元組 -256到255
- 整型 int 4位元組 -65536-65535
- 長整型 long 8位元組 一般用於表示10億以上的資料
- 單精度浮點型 float 4位元組 範圍比long要大
- 雙精度浮點型 double 8位元組
- 字元型 char 2位元組 0-65535
- 布林型 boolean 不確定 true,false
說明:浮點型使用注意
- 不要再數量級相差很大的浮點型別之間進行運算
- 避免進行等量判斷
3.型別轉換
什麼是型別轉換?一種型別的值賦值給另一種型別的變數時發生型別轉換。
有哪些種類的的型別轉換?兩類,分別是自動型別轉換和強制型別轉換。
3.1.數值型別之間的轉換
- int n = 263;
- byte b = (byte)n;//強制型別轉換
- System.out.println(b);//輸出是7,原因是超出範圍,直接截斷
- short n3 = 5;//只要沒超出short範圍就是可以自動型別轉換
- n3 = n3 + 5;//這裡是高型別賦值給低型別,跟字面量賦值不一樣,編譯不通過。
- short n4 = 5;
- n4 += 5;//正確,也是擴充套件賦值運算子,會進行強制型別轉換。
- 注:雙精度的字面量就是在單精度範圍了,也無法自動型別轉換。
3.2.自動型別轉換
什麼時候發生自動型別轉換?範圍小的型別賦值給範圍大的型別時發生自動型別轉換,資料不會丟失,型別也不會丟失。
3.3.強制型別轉換
什麼時候發生強制型別轉換?範圍大的資料型別賦值給範圍小的數字型別。強制型別轉換資料可能會丟失,比如把4個位元組的int型別賦值給1個位元組的byte型別,是直接把最右邊的1位元組中的資料複製給了byte型別的1位元組變數。
語法格式:(資料型別)運算元
3.4.型別提升
運算元1型別 | 運算元2類 | 運算後的型別 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
三、運算子
1.運算子的分類
- 按運算元的個數分類:一元運算子(++ - -)、二元運算子(+ - * / %)以及三元運算子(? :)
- 按功能分類:演算法運算子、關係運算符、邏輯運算子、賦值運算子、條件運算子以及位運算子
2.演算法運算子:+ - * / %
2.1.使用除法注意:
- 若除數與被除數都是整數,結果會取整;
- 若除數與被除數都是整數,除數不能為0,否則丟擲演算法異常,編譯無法通過。
- 浮點型別的特殊值:正無窮大、負無窮大、NaN非數字。如下:
- System.out.println(5.0 / 0);//輸出:正無窮大
- System.out.println(-5.0 / 0);//輸出:負無窮大
- System.out.println(0.0 / 0);//輸出:NaN非數字
2.2.使用取餘注意:
- 5 % 2 = 1
- 5 % -2 = 1
- -5 % 2 = -1 //符號由被除數決定
- 5.0 % 2 = 1.0
2.3.自增自減運算子:++ - -
- 字尾表示:x++,先使用,再自加
- 字首表示:++x,先自加,再使用
3.關係運算符
- > < >= <= == ! = 運算結果是布林型別boolean
4.邏輯運算子
- 與(&&)、或(||)和 非(!)
- 運算元必須是boolean型別!
- &&, || 和 &,| 它們的區別是什麼?&& || 短路與(或),& | 非短路與(或)。
5.賦值運算子(==)
擴充套件賦值運算子:+= -= *= /= %=
使用注意:
- short n3 = 5;//只要沒超出short範圍就是可以的
- //n3 = n3 + 5;//這裡是高型別賦值給低型別,跟字面量賦值不一樣,編譯不通過。
- short n4 = 5;
- n4 += 5;//正確,也是擴充套件賦值運算子,會進行強制型別轉換。
6.條件運算子(? :)
- 格式:表示式1?表示式2:表示式3
- 說明:若表示式1結果為true,則執行表示式2,否則執行表示式3
7.位運算子
7.1.位運算子分類
- & 位與
- | 位或
- ^ 異或
- ~ 非
- << 左移
- >> 右移
- >>> 無符號右移
7.2.位運算
計算機中二進位制表示形式有以下3種:以十進位制5(4個位元組)為例,整數是精確儲存。
原碼:由符號位和數值位組成,符號位:0表示正數,1表示負數
- 00000000-00000000-0000000-00000101 5的原碼
- 10000000-00000000-0000000-00000101 -5原碼
反碼:正數的反碼與原碼一樣,負數的反碼在原碼的基礎上除符號位外,其他位取反
- 00000000-00000000-0000000-00000101 5的反碼
- 11111111-11111111-11111111-11111010 -5的反碼
補碼:正數的補碼與原碼一樣,負數的補碼是在反碼的基礎上加1
- 00000000-00000000-0000000-00000101 5的補碼
- 11111111-11111111-11111111-11111011 -5的補碼
- Java中採取補碼的形式進行儲存和運算的,所以,位運算是針對補碼的。
&位與,表示1 & 1為1,1 & 0 為0,例如:5 & 2 ,即是從右往左對應位進行&運算,如下
- 00000000-00000000-0000000-00000101 5的補碼
- 00000000-00000000-0000000-00000010 2補碼
- 00000000-00000000-0000000-00000000 計算結果:0的補碼
| 位與,表示0 | 0為0,1 | 0 為0,例如:5 | 2,從右往左對應位進行 | 運算,如下
- 00000000-00000000-0000000-00000101 5的補碼
- 00000000-00000000-0000000-00000010 2補碼
- 00000000-00000000-0000000-00000111 計算結果:7的補碼
^異或,表示相同為0,不同為1,例如:5 ^ 2,從右往左對應位進行 ^ 運算,如下
- 00000000-00000000-0000000-00000101 5的補碼
- 00000000-00000000-0000000-00000010 2補碼
- 00000000-00000000-0000000-00000111 計算結果:7的補碼
- 注:異或同一個數2次還是其本身。
~取反,表示非,例如:~5,從右往左進行 ~ 運算,如下
- 00000000-00000000-0000000-00000101 5的補碼
- 11111111-11111111-11111111-11111010 計算結果:變化特別大
<<左移,表示向左移動n位,然後用0補位,例如:5 << 2,如果是整數移動的規律:結果為5*2^2 = 20。
- 00000000-00000000-0000000-00000101 5的補碼
- 00000000-00000000-0000000-00010100 計算結果:20的補碼
>>右移,表示向右移動n位,高位是0用0補,是1用1補,比如5 >> 2,如果是整數移動的規律:結果為5/(2^2) = 1。
- 00000000-00000000-0000000-00000101 5的補碼
- 0000000000-00000000-0000000-000001 計算結果:1補碼
>>>無符號右移,表示向右移動n位,高位用0補位。比如5 >>> 2
- 00000000-00000000-0000000-00000101 5的補碼
- 0000000000-00000000-0000000-000001 計算結果:1的補碼
8.運算子的優先順序
8.1.運算子的優先順序
- ()
- ++ -- ! ~ +(正) -(負)
- * \ %
- + -
- << >> >>>
- < > <= >=
- == !=
- &
- ^
- |
- &&
- ||
- ? :
- = *= /= %= += -=
8.2.常用的整理如下
- ()
- ++ -- !
- 演算法:* / %
- + -
- 關係:> >= < <=
- == !=
- 邏輯:&&
- 邏輯:||
- 條件:?:
- 賦值: =
四、流程控制
1.控制語句分類
- 順序語句:從上到下按順序依次執行
- 分支語句:部分程式碼選擇執行或不執行
- 迴圈語句:部分程式碼重複執行
2.流程圖
- 圓角長方形表示開始/結束
- 平行四邊形表示輸入輸出
- 正方形表示執行
- 菱形表示判斷
3.條件語句
3.1.單分支條件語句
- 格式:if( ) { }
- 只是單獨判斷條件是否成立
3.2.雙分支條件語句
- 格式:if(){ }else{ }
- 需要對條件成立和不成立的情況分別處理
3.3.多重if 條件語句
- 格式:if(){ }else if(){ }else if(){ }else{ }
- 一旦前面條件成立,則不做後續判斷。
- 注:基本型別直接用雙(==)判斷,但是引用資料型別不行。即字元可以,字串不行。
3.4.多分支選擇語句
3.4.1.格式
- switch(表示式){
- cases 值1: 語句;break;
- cases 值1: 語句;break;
- ……
- default:語句;break;
- }
3.4.2.說明
- 表示式:只支援byte、short、int、char、String、列舉型別enum。
- 表示式是的值的型別與常量值的型別要相符。
- 同一個switch中標籤值不能重複。
- 所有的break均可省略,若不加break語句,就會對其他條件內容穿透執行且不會再進行判斷。
- default的位置可以更改,不一定非得放在最後,位置變了但是作用不會變。
- default放在前面,又沒有break,一旦執行了default的程式碼就會發生穿透執行。
- 支援標籤堆疊的語法,比如:
- switch (month){
- case 3:
- case 4:
- case 5:System.out.println(month+"月屬於春季");break;
- case 6:
- case 7:
- case 8:System.out.println(month+"月屬於夏季");break;
- }
3.4.3.switch和多重if的區別:
- 相同:多個條件判斷
- 不同:多重if用於區間判斷,switch用於等值判斷。等值判斷,switch效率高於多重if,因為常量值會一次性載入到記憶體中。
3.4.4.分支語句巢狀:所有分支語句可以相互巢狀
4.迴圈語句
4.1.迴圈的特點
- 任何迴圈都具備的兩個特點是迴圈條件和迴圈操作。
4.2.迴圈分類
- 非固定次數迴圈:while 和 do-while。解題方式:確定條件和迴圈操作
- 固定次數迴圈:for。解題方式:確定3要素,即迴圈變數初始值、迴圈變數終止值(條件)和迴圈變數變化值(迭代)
- 注:只要是迴圈的問題,三者都可以解決。
4.3.for、while和do-while的比較
- for和while是先判斷後執行,而do-while是先執行後判斷。
- for擅長處理固定次數迴圈,while和do-while擅長處理非固定次數迴圈。
- for的迴圈變數一般定義在區域性,迴圈外無法使用,而while和do-while的迴圈變數一般定義在迴圈外,迴圈結束後能使用。
4.4.多重迴圈
- 迴圈巢狀:3種迴圈相互可巢狀。
- 關鍵點:尋找行、列迴圈變數之間的關係
5.跳轉語句
5.1.break
- 場合:switch、迴圈
- 作用:結束當前迴圈
- 注意:switch在迴圈中使用時,要注意break的影響,僅是用來結束switch的。
5.2.return
- 場合:方法的任何位置
- 作用:返回值,或對於無返回值的方法就會結束當前方法執行
5.3.continue
- 場合:只能用在迴圈中,結束本次迴圈
- 作用:加速迴圈
5.4.迴圈標籤
- 場合:用在迴圈中
- 作用:對多層次迴圈起作用
- 語法:break 標籤;或者 continue 標籤;如下:
- a://標籤
- for (int i = 1; i <= 5; i++) {
- for (int j = 1; j <= 5; j++) {
- if (i == 3) {
- // break;//結束內迴圈
- break a;//跳轉到標籤位置,結束外迴圈
- // return;//結束方法
- }
- System.out.print(i + "行," + j + "列 ");
- }
- System.out.println();
- }
- a://標籤
- for (int i = 1; i <= 5; i++) {
- for (int j = 1; j <= 5; j++) {
- if (j == 3) {
- // continue;//結束本次內迴圈,進行下一次內迴圈
- continue a;//結束本次外迴圈,跳到下次外迴圈
- }
- System.out.print(i + "行," + j + "列 ");
- }
- System.out.println();
- }
五、補充知識
1.註釋
單行註釋: //
多行註釋: /* */
文件註釋: /** */
位置:
- 類,類中成員,介面等
生成:
- javadoc -d doc Hello.java //生成幫助文件,其中-d doc表示存放在doc目錄中,沒有則生成目錄再存放。
- javadoc -d doc -author -version Hello.java //將作者和版本資訊也生成
優秀的註釋:
- 程式碼不明確的地方;
- 程式碼修改的地方;
- 經典演算法;
- 分支和迴圈語句;
- 對外開發的,如介面。
2.print( ) 和 println( ) 的區別
print( ) 輸出後不換行,必須帶引數。
println( ) 輸出後換行,可以不帶引數。
3.轉義字元
3.1.轉義字元
定義
- 兩個字元組合起來表示一個字元。
作用
- 有一些字元具有特別的意義,無法直接表示,需要通過轉義字元。
表示方式
- 八進位制表示:轉義範圍為\000-\377,轉換成十進位制是0-255;
- 十六進位制表示:轉義範圍為\u0000-\uffff,轉換成十進位制是0-65535,其中u表示Unicode字元編碼,什麼是字元編碼?見下面;
- 常用轉義字元:\\ 表示反斜槓,\' 表示單引號,\"表示雙引號,\t表示水平製表符且左對齊,\n表示換行符;
3.3.進位制間的轉換
- 十進位制轉二進位制:除2取餘法,到商為0終止,餘數從下往上取,結果是從右往左寫。
- 十進位制轉八進位制:除8取餘法,到商為0終止,餘數從下往上取,結果是從右往左寫。
- 十進位制轉十六進位制:除16取餘法,到商為0終止,餘數從下往上取,結果是從右往左寫。
- 二進位制轉十進位制:位權求和法,從低位到高位組合運算,比如101,1*2^0+0*2^1+1*2^2
- 八進位制轉十進位制:位權求和法,從低位到高位組合運算,比如17,7*8^0+1*8^1
- 十六進位制轉十進位制:位權求和法,從低位到高位組合運算,比如19,9*16^0+1*16^1
- 二進位制轉八進位制:從右向左3位組合,每個組合轉換成十進位制,按組合的順序組成八進位制值
- 二進位制轉十六進位制:從右向左4位組合,每個組合轉成十進位制,按照組合順序組成十六進位制值
3.4.字元編碼
3.4.1.什麼是字元編碼?
圖片、音訊都是以二進位制方式儲存,對於字元,給每個字元進行編碼,然後將編碼再轉成二進位制進行儲存。例如歐美字元使用ascii碼就能表示所有的字元,範圍是0-255,用八進位制表示,但是,亞洲國家都有自己的字元,所以也需給字元進行編碼,所以需要對全世界所有已知的書面語言都進行編碼,從而產生了Unicode編碼,範圍是0-65535,用十六進位制表示。簡單記憶:字元a十進位制為97,八進位制為\141,十六進位制表示\u0061。
3.4.2.為什麼要字元編碼?
給字元編碼後,計算機直接使用編碼可以更容易也更高效的轉換成二進位制進行存取。
4.控制檯輸入
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner superman = new Scanner(System.in);//建立一個物件:建立一個超人
//呼叫方法:超人施展技能
//int n = superman.nextInt();//從控制檯獲取一個整數
//System.out.println("n = "+n);
//double n1 = superman.nextDouble();
//String n2 = superman.next();
char n3 = superman.next().charAt(0);
System.out.println("n3 = "+n3);
}
}
5.格式控制
5.1.輸出格式:
- double n = 345.49379852389549;
- System.out.printf("我想展示小數%.2f", n);
- System.out.println();
- int n1 = 11;
- double n2 = 11.1;
- char c = 'a';
- boolean b = true;
- String s = "hello";
- System.out.printf("整數%d,小數%f,字元%c,布林%b,字串%s", n1,n2,c,b,s);
5.2.使用DecimalFormat類指定小數格式
- // 0 佔位 四捨五入
- // # 佔位 四捨五入
- DecimalFormat df = new DecimalFormat("0000.00");//整數部分,位數不夠用0補齊
- System.out.println(df.format(n));
- DecimalFormat df1 = new DecimalFormat("####.##");//整數部分,位數不夠不會補齊。
- System.out.println(df1.format(n));