一、關鍵字&標識符 關鍵字:被Java語言賦予了特殊含義,用做專門用途的字元串(單詞) 標識符:凡是自己可以起名字的地方都叫標識符 1. 命名的規範(一定要遵守,不遵守就會報編譯的錯誤) 由26個英文字母大小寫,0-9 ,_或 $ 組成 數字不可以開頭。 不可以使用關鍵字和保留字,但能包含關鍵字和保 ...
一、關鍵字&標識符
關鍵字:被Java語言賦予了特殊含義,用做專門用途的字元串(單詞)
標識符:凡是自己可以起名字的地方都叫標識符
1. 命名的規範(一定要遵守,不遵守就會報編譯的錯誤)
- 由26個英文字母大小寫,0-9 ,_或 $ 組成
- 數字不可以開頭。
- 不可以使用關鍵字和保留字,但能包含關鍵字和保留字。
- Java中嚴格區分大小寫,長度無限制。
- 標識符不能包含空格。
2. Java中的名稱命名規範:(不遵守,也不會出現編譯的錯誤)
- 包名:多單片語成時所有字母都小寫:xxxyyyzzz
- 類名、介面名:多單片語成時,所有單詞的首字母大寫:XxxYyyZzz
- 變數名、方法名:多單片語成時,第一個單詞首字母小寫,第二個單詞開始每個單詞首字母大寫:xxxYyyZzz
- 常量名:所有字母都大寫。多單詞時每個單詞用下劃線連接:XXX_YYY_ZZZ
3. 註釋:用於說明代碼的用途和作用,方便讀寫和維護
- HTML註釋:
- Java註釋:
- //單行註釋
- /* 多行註釋 */
- /** 文檔註釋 */
二、變數
變數是java程式中最基本的存儲單元,可以存儲一個數據
java中變數按照數據類型來分類:基本數據類型 vs 引用數據類型(數組 類 介面)
1. 基本數據類型
- 整型:byte(8 bit) short int(預設類型) long
- 浮點型:float double (預設類型) float類型的數據: 必須在小數末尾添加上"F"或"f"
- 字元型:char(‘ ’)(1字元=2位元組)
- 布爾類型: boolean(只能取值為true 或false,不能取null)
- 補充:按照在類中存在的位置的不同:成員變數 vs 局部變數
2. 局部變數
- 局部變數必須編寫在方法體中
- 局部變數只能在當前方法體中被訪問
- 局部變數在使用之前,必須被賦值
3. 成員變數
- 全局變數只能編寫所有方法體之外
- 全局變數可以在任何方法體中被訪問
- 全局變數在使用之前如果沒有賦值,系統將自動賦予預設值
- 全局變數的操作,會應用其他引用了該變數的代碼
4. 基本數據類型的預設值
- 整數: 0
- 小數: 0.0
- 字元: 空格 或 0
- 布爾: false
三、變數的運算
1. 自動類型轉換
容量小的數據類型自動轉換為容量大的數據類型,
此時的容量大小指的是數的範圍的大小
byte、char、short、--->int --->long --->float --->double
short s = 12;
int i = s + 2;
註意:byte short char之間做運算,結果為int型!
2. 強制類型轉換
將取值範圍大/精度高的數據類型 轉為 取值範圍小/精度低的數據類型
- 是①的逆過程。使用“()”實現強轉
- 強制類型轉換可能精度損失
double d1 = 12.9;
int t1 = (int)d1;//截斷操作
System.out.println(t1);
3. 練習
char c = 'a';
int num = 10;
string str = "hello";
System.out.println(c + num + str); //107hello
System.out.println(c + str + num); //ahello10
System.out.println(c + (num + str)); //a10hello
System.out.println((c + num) + str); // 107hello
System.out.println(str + num + c); // helloa10
四、運算符
運算符是一種特殊的符號,用以表示數據的運算、賦值和比較等
1. 算術運算符
+ - + - * / % ++ -- +
- /: int i = 12; i = i / 5;
- %:最後的符號只跟被模數相同
- 前++:先+1,後運算 後++:先運算,後+1
- +:String字元串與其他數據類型只能做連接運算,且結果為String類型。sysout('' + '\t' + ''); vs sysout("" + '\t' + '')
2. 賦值運算符
= += -= *= /= %=
int i= 12;
i = i * 5;
i *= 5;//與上一行代碼同樣的意思
//【特別地】
short s = 10;
s = s + 5;//報編譯的異常
s = (short)(s + 5);
s += 5;//s = s + 5,但是結果不會改變s的數據類型。
int m = 2;
int n = 3;
n *= m++;
Sysout(m);// 3
Sysout(n);// 6
int n = 10;
n += (n++) + (++n); //32
變數A++ 與 ++變數A的區別
- 變數A++ / ++變數A: 變數A+1,將結果賦給變數A
- 變數A-- / --變數A: 變數A-1,將結果賦給變數A
- 變數A=變數B++/--:先將變數B的值賦給變數A,然後執行變數自增或自減1 ,先賦值,後自增/自減
- 變數A=++/--變數B:先執行變數B自增或自減1,然後將變數B的值賦給變數A ,先自增/自減,後賦值
3. 比較運算符
== > < >= <= instanceof
【註意】區分== 與 = 區別。
進行比較運算操作以後,返回一個boolean類型的值
4>=3 表達的是4 > 3或者 4 = 3.結果是true。
if(i > 1 && i < 10){ }
不能寫為:if(1 < i < 10){}
4. 邏輯運算符(運算符的兩端是boolean值)
& && | || ^ !
【註意】區分 & 與 && 的區別,以及 | 與 || 的區別我們使用的時候,選擇&& , ||
| || ,& &&區別
- &:分別比較前後兩個條件,當前後兩個條件都為true時,整體為true,否則為false.
- &&[短路與]:當前後兩個條件都為true時,整體為true,否則為false. 如果第一個為false時,將不再判斷之後的條件,將直接返回false
- |:分別判斷前後兩個條件,至少有一個為true時,整體為true,否則為false.
- ||[短路或]:當前後兩個條件至少有一個為true時,整體為true,否則為false. 如果第一個條件為true時,將不再判斷之後的條件,直接返回true.
5. 位運算符(兩端是數值類型的數據)
<< >> >>> & | ^ ~
- << 在一定範圍內,每向左移動一位相當於 * 2
【例子】1.如何交換m = 12和n = 5的值
2.將60轉換為十六進位輸出。
m = m + n;
n = m - n;
m = m - n;
// 好處不用定義變數,但有局限性,只能用數值類型
6. 三元運算符:(條件表達式)? 表達式1 : 表達式2
- 既然是運算符,一定會返回一個結果,並且結果的數據類型與表達式1,2的類型一致
- 表達式1與表達式2 的數據類型一致
- 使用三元運算符的,一定可以轉換為if-else。反之不一定成立
五、流程式控制制
1. 分支結構
1. 條件判斷
三種格式
①if(條件表達式){ }
②if(條件表達式){
//執行的語句1;
}else{
//執行的語句2;
}
③if(條件表達式1){
//執行的語句1;
}else if(條件表達式2){
//執行的語句2;
}else if( 條件表達式3){
//執行的語句3;
}...
}else{
//執行的語句;
}
註意:
- 一旦滿足某個條件表達式,則進入其執行語句塊執行,執行完畢,跳出當前的條件判斷結構,不會執行其以下的條件結構語句
- 如果諸多個條件表達式之間為“互斥”關係,多個結構可以上下調換順序
- 如果諸多個條件表達式之間為“包含”關係,要求條件表達式範圍小的寫在範圍大的上面
2. 選擇結構
switch(變數){
case 值1:
break;
case 值2:
break;
...
default:
break;
}
註意:
- 變數可以為如下的數據類型:byte short int char 枚舉 String
- case後只能填寫變數的值,不能寫範圍
- default是可以省略的。並且其位置也是靈活的,但是通常將其放在case語句之後
- 一旦滿足某個case語句,則進入執行其操作。直至遇到break或者程式終止
- 若要判斷的語句的條件滿足switch變數的數據類型,且值不多的情況下,建議選擇switch-case,除此之外,選擇if-else.
2. 迴圈結構
1. 三種格式
①初始化條件
②迴圈條件 boolean類型
③迭代部分
④迴圈體
for(①;②;③){
④
}
①
while(②){
④
③
}
①
do{
④
③
}while(②);
// 遍歷100以內的偶數
for(int i = 1; i<100; i++){
if(i % 2 == 0){
System.out.println(i);
}
}
註意:
- 不同的迴圈結構之間可以相互轉換
- while和do-while的區別:do-while程式至少會執行一次
2. 嵌套迴圈
迴圈結構還可以聲明迴圈。讓內層迴圈結構整體充當外層迴圈的迴圈體。
若外層迴圈執行m次,內層迴圈執行n次,整個程式執行m*n次
//題目
******
******
******
for(int i = 0;i < 3;i++){
for(int j = 0;j < 6;j++){
System.out.print("*");
}
System.out.println();
}
//說明:外層迴圈控制行數,內層迴圈控制列數
3. 無限迴圈結構
for(;;){
...
if( ){
break;
}
...
}
//或者
while(true){
...
if( ){
break;
}
...
}
往往我們在無限迴圈結構內部提供迴圈的終止條件,使用break關鍵字。否則,此迴圈將無限制的執行下去,形成死迴圈,死迴圈是我們要避免的
4. break & continue
-
break:
使用switch-case結構或者迴圈結構中
在迴圈結構中,一旦執行到break,就跳出當前迴圈。
-
continue:使用在迴圈結構中
- 一旦執行到continue,就跳出當次迴圈。
for(int i = 1;i <= 10;i++){
if(i % 4 == 0){
//break; //123
continue; //123567910
}
System.out.print(i);
}
在嵌套迴圈中,使用帶標簽的break和continue
label:for(int i = 1;i < 5;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break;
//continue;
//break label;
continue label;
}
System.out.print(j);
}
System.out.println();
}
六、例題
1. 最大公約數和最小公倍數
/*
題目:輸入兩個正整數,求最大公約數和最小公倍數
比如:12和20的最大公約數是4,最小公倍數是60
*/
Scanner scan = new Scanner(System.in);
System.out.println("請輸入第一個正整數:");
int m = scan.nextInt();
System.out.println("請輸入第二個正整數:");
int n = scan.nextInt();
// 獲取這兩個數中的最小值
int min = (m <= n) ? m : n;
for(int i = min; i > 0; i--){
if(m % i == 0 && n % i == 0 ){
System.out.println("最大公約數為:"+i);
break;
}
}
// 獲取這兩個數中的最大值
int max = (m <= n) ? n : m;
for(int i = max; i <= n*m; i++){
if(i % m == 0 && i % n == 0 ){
System.out.println("最小公倍數為:"+i);
break;
}
}
2. 質數
//100以內的質數的輸出
boolean isFlag = true;
for(int i = 2; i <= 100; i++){
for(int j = 2; j < i; j++){
if(i % j == 0){
isFlag = False;
break;
}
}
if(isFlag == ture){
System.out.println(i);
}
isFlag = true;
}
// 優化
boolean isFlag = true;
for(int i = 2; i <= 100; i++){
// j < i的開方
for(int j = 2; j <= Math.sqrt(i); j++){
if(i % j == 0){
isFlag = False;
break;
}
}
if(isFlag == ture){
System.out.println(i);
}
isFlag = true;
}