Java 基本功01-基本資料型別和各種運運算元
阿新 • • 發佈:2019-12-31
1. Java的資料型別:
1.1 Java中資料型別主要分為兩大類:
1.1.1 基本資料型別和引用資料型別
1.2 基本資料型別:
1.2.1 八大資料型別:
整型 | 佔用記憶體空間大小 | 資料範圍 |
---|---|---|
byte | 1位元組(8bit) | -128 ~ 127 |
short | 2位元組(16bit) | -32768 ~ 32767 |
int | 4位元組(32bit) | - 2 ^ 31 ~ 2^31 - 1 |
long | 8位元組(64bit) | - 2 ^ 63 ~ 2^63 - 1 |
浮點型 | 佔用記憶體空間大小 | 資料範圍 |
---|---|---|
float | 4位元組(32bit) | ±3.4 * 10 ^ 38 |
double | 8位元組(64bit) | 10 ^ 308 |
字元型 | 佔用記憶體空間大小 | 資料範圍 |
---|---|---|
char | 2位元組(16bit) | 可以儲存中文 |
布林型別 | 佔用記憶體空間大小 | 資料範圍 |
---|---|---|
boolean | 視情況而定 | true false |
1.2.2 基本資料型別的轉換:
-Java中所有的數值型變數都可以相互轉換。
自動型別轉換:
-當把一個範圍比較小的數值型別或者變數直接賦值給另外一個範圍比較大的變數時,系統預設可以進行自動的型別轉換。就如同存在兩瓶水,一個大瓶和一個小瓶,當把小瓶的水倒入大瓶中時不會有任何問題。
Java中支援的自動型別轉換的型別:
1、byte ->short->int->long->float->double
2、char->int->long->float->double
強制型別轉換:
-如果希望上面的自動轉換型別中,箭頭右邊的型別轉換成左邊的型別,則必須進行強制型別轉換。強制型別轉換會造成數值或變數的資料精度丟失。當進行強制的型別轉換時,類似於把大瓶裡的水倒入小瓶中,就會造成水的溢位。
-注意:當試圖把一個範圍比較大的數值型別或者變數轉換為範圍比較小的型別時,必須格外小心,因為非常容易引起資料資訊的丟失。
複製程式碼
1.3 引用資料型別
1.3.1 五種引用資料型別:
類、介面、陣列、列舉、註解
複製程式碼
1.4 基本資料型別和引用資料型別的區別:
從概念方面來說:
-基本資料型別:變數名指向具體的數值
-引用資料型別:變數名指向儲存資料物件的記憶體地址
從記憶體方面來說:
-基本資料型別:變數在宣告之後,Java 就會立刻分配記憶體給其使用
-引用資料型別:變數宣告時不會分配記憶體,只是儲存了一個記憶體地址
從使用方面來講:
-基本資料型別:使用時需要賦予具體的值,判斷時使用 == 號
-引用資料型別:使用時可以賦予 null ,判斷時使用 equals() 方法
複製程式碼
1.5 常量
1.5.1 生活中的常量:
一週7天
一天24小時
一小時60分鐘
一分鐘60秒
3.1415926...
A B C D a b c d
文字:你 我 他
語句:先帝創業未半...
程式碼來源於生活,最終反饋於生活!
數值,文字和文字,這些都可以認為是常量!!!
複製程式碼
1.5.2 開發中的常量:
定義:
在程式執行過程中,不會發生改變的量,稱之為常量
按照習慣,可以把常量劃分為這麼幾個類:
整數:1 2 3 4 5 -1 -2 -3- -4 -5
小數(浮點數):3.1415926 0.618 9.9
真假關係(布林型別):T true F false
字元:'A' 'a' '你' '我' '他'
【注意】字元常量是【英文單引號】包含的【單個元素】
字串:
"你好,在嗎" "不,我不在"
【注意】字串常量是【英文雙引號】包含的所有內容
複製程式碼
1.6 變數
1.6.1 生活中的的變數:
時間
天氣溫度
年齡
體重
銀行卡餘額
複製程式碼
1.6.2 程式碼中定義變數的格式:
格式:
資料型別 變數名 = 初始化資料;
int a = 10;
變數名裡面儲存的資料,可以在程式的執行過程中發生改變!
資料型別:
約束當前變數的資料是什麼型別
變數名:
方便操作變數的名字
= 賦值號:
把賦值號右側的資料賦值給左側的變數名
初始化資料:
對應資料型別的初始值
變數名的命名規則可參考:
《阿里巴巴Java開發規範》 附上檔案下載地址:
複製程式碼
2.運運算元
2.1 各種運運算元
2.1.1 算術運運算元:
生活中的運運算元:
+ - × ÷ ()
對於程式設計師而言:
+ - * / () %
15 / 4 = 3
先乘除後加減
有括號先處理括號裡面的內容
除數不能為0,無效運算
基本法則是從左至右計算
注意事項:
1、要關注變數在執行過程中,變數儲存資料的改變。
2、注意運運算元使用到底是哪一個。
3、變數的值有且只有被賦值的情況下,才會被改變,變數沒有被賦值,不會更改。
複製程式碼
2.1.2 賦值運運算元:
= += -= *= /= %=
例如:
numA = numA + numB ==> numA += numB
複製程式碼
2.1.3 自增自減運運算元:
++:
在【變數之後】,首先執行當前語句,再執行自增操作
在【變數之前】,首先執行自增操作,再執行當前語句
--:
在【變數之後】,首先執行當前語句,再執行自減操作
在【變數之前】,首先執行自減操作,再執行當前語句
注意:
自增自減運運算元有且只能操作變數!
自增運算相當於當前變數 += 1
自減運算相當於當前變數 -= 1
從開發者的閱讀性考慮
1、如果使用自增自減運運算元,請單獨成行!
2、能夠使用 += 1 或者 -= 1 替代,就不要使用自增自減
複製程式碼
2.1.4 關係運算子:
> < ≥ ≤ ≠ =
這是數學中的關係運算子
> < >= <= != ==
開發中的關係運算子
關係運算子的結果是 true 或者 false
複製程式碼
2.1.5 邏輯運運算元:
&& 與:
同真為真,有假即假
銀行的保險櫃,開啟保險櫃需要兩把鑰匙,缺一不可
|| 或:
自家的門,只有一把鑰匙可以開門
有真即真,同假為假
! 非:
犟 槓精
取反
邏輯運運算元的斷路原則:
class Demo {
public static void main(String[] args) {
int num = 10;
/*
邏輯與斷路原則:
與 同真為真,有假【即】假
在邏輯與表示式中,出現任何一個條件為 false 條
件,從 false 條件開始,之後的表示式都不會執行
因為整個邏輯與表示式的結果不會有任何的更改。
*/
boolean ret = 3 > 4 && ++num > 5;
System.out.println("ret =" + ret); // false
System.out.println("num =" + num); // 10
int num2 = 20;
/*
邏輯或斷路原則:
或 有真【即】真,同假為假
在邏輯或表示式中,出現任何一個條件為 true 條
件,從 true 條件開始,之後的表示式都不會執行
因為整個邏輯或表示式的結果已經確定,之後的運算
沒有意義!
*/
ret = 4 > 3 || ++num2 > 200;
System.out.println("ret =" + ret); // true
System.out.println("num2 =" + num2); // 20
}
}
複製程式碼
2.1.6位運運算元:
& | ~ ^ >> <<
&:
與 運算
同1為1,有0【即】0
|:
或 運算
有1【即】1,同0為0
~:
取反 運算
1為0,0為1
^:
異或 運算
兩個運算元,相同為0,不同為1
>>:
右移 運算
a >> b 將數值 a 的二進位制數值從 0 位算起到第 b - 1 位,整體向右方向移動 b 位,符號位不變,高位空出來的位補數值 0。
5 >> 1 ===> 1000 0000 0000 0101 >> 1 = 1000 0000 0000 0010 = 2
總結規律:a >> b = a / (2 ^ b)
<<:
左移 運算
a << b 將數值 a 的二進位制數值從 0 位算起到第 b - 1 位,整體向左方向移動 b 位,符號位不變,低位空出來的位補數值 0。
5 << 1 ===> 1000 0000 0000 0101 << 1 = 1000 0000 0000 1010 = 10
總結規律:a << b = a * (2 ^ b)
複製程式碼
2.1.7 三目運運算元:
語法結構:
(boolean表示式) ? (表示式1) : (表示式2)
執行流程:
先判斷 boolean 表示式的值:
若為 true,則整個運算式的值為表示式1的值;
若為 false,則整個運算式的值為表示式2的值。
int a = 10,b = 1;
int max = a > b ? a : b; // 如果a>b為true,說明a大,則把a的值賦給max,若a>b為false,說明b大,把b賦給max
複製程式碼
3. 簡單小練習
3.1 補充
3.1.1 Scanner 的使用
目前的程式碼是需要修改變數的數值值之後,重新編譯然後在繼續執行,對於普通使用者來說,沒有任何的價值。我們需要給予使用者一個從鍵盤上輸入資料的方式和方法。
需要藉助於 Scanner !!!
1、點技能點!!!【導包】
在 class 之前
import java.util.Scanner;
2、建立一個 Scanner 的"變數"
Scanner sc = new Scanner(System.in);
3、使用 Scanner 掃描器中的方法,從鍵盤上獲取使用者輸入的資料
獲取 int 型別 int num = sc.nextInt();
獲取 float 型別 float num = sc.nextFloat();
獲取 Double 型別 double num = sc.nextDouble();
獲取 char 型別 char ch = sc.nextLine().charAt(0);
複製程式碼
3.1.2 使用者體驗友好性考慮
-作為一個軟體開發者,在程式碼中需要給予使用者適當的提示,告知使用者,這裡需要輸入還是獲取從使用者使用的角度去考慮
-這就是使用者體驗友好性的體現
複製程式碼
3.1.3 使用者輸入資料的過濾問題
在我們進行使用者體驗友好性考慮之後就會有以下問題:
-使用者輸入的資料是存在一定的錯誤情況的,那麼我們的程式是要考慮使用者輸入資料的【合法性】問題
-如果使用者輸入的資料不合法,則不能進入正常的程式碼執行,而且給予使用者一個提示,如果使用者輸入的資料正確,則程式繼續執行!!!
複製程式碼
3.2 使用邏輯和關係運算子寫一些條件判斷的要求。
要求:
1、參考ASCII碼錶
2、所有的字元請使用字元本身,不允許使用對應的編碼
3、年份判斷,用小括號包含條件
複製程式碼
3.2.1 判斷一個字元型別的變數是不是一個大寫英文字母。
public class TestUpperCase {
public static void main(String[] args) {
System.out.println("請輸入一個英文字母");
Scanner scanner = new Scanner(System.in);
char ch = scanner.nextLine().charAt(0);
if (ch >= 'A' && ch <= 'Z') {
System.out.println("您輸入的是大寫英文字母!");
} else {
System.out.println("您輸入的是小寫英文字母!");
}
}
}
複製程式碼
3.2.2 判斷一個字元型別的變數是不是一個英文字母。
public class TestEnglishCase {
public static void main(String[] args) {
System.out.println("請輸入一個字元:");
Scanner scanner = new Scanner(System.in);
char ch = scanner.nextLine().charAt(0);
if ((ch > 'A' && ch < 'Z') || (ch > 'a' && ch < 'z')) {
System.out.println("您輸入的是一個英文字母!");
} else {
System.out.println("您輸入的不是一個英文字母!");
}
}
}
複製程式碼
3.2.3 判斷一個年份是不是閏年。
/*
閏年條件:
能被4整除,但是不能被100整除。或者可以被400整除
year % 4 == 0
year % 100 != 0
year % 400 == 0
*/
public class TestYear {
public static void main(String[] args) {
System.out.println("請輸入一個年份:");
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println("這是一個閏年!");
} else {
System.out.println("這不是一個閏年!");
}
}
}
複製程式碼