1. 程式人生 > 其它 >Java本科學習 0x02 語法

Java本科學習 0x02 語法

題記

鴿了,想不出來了,江郎才盡了,嗚嗚嗚

1、型別轉換問題

型別轉換(理解)

在Java中,會存在不同型別的資料需要一起參與運算,所以這些資料型別之間是需要相互轉換的,分為兩種情況:自動型別轉換和強制型別轉換。

自動型別轉換

*類型範圍小的變數,可以直接賦值類型範圍大**的變數。

把一個表示資料範圍小的數值或者變數賦值給另一個表示資料範圍大的變數。這種轉換方式是自動的,直接書寫即可。例如:

double num = 10; // 將int型別的10直接賦值給double型別
System.out.println(num); // 輸出10.0

byte a = 12 ;
int b = a;
System.out.println(b); // 12

表示式的自動型別轉換

在表示式中,小範圍型別的變數會自動轉換成當前較大範圍的型別再運算。

注意事項:

表示式的最終結果型別由表示式中的最高型別決定。

在表示式中,byte、short、char 是直接轉換成int型別參與運算的。

強制型別轉換

類型範圍大的資料或者變數,不能直接賦值類型範圍小的變數,會報錯,把一個表示資料範圍大的數值或者變數賦值給另一個表示資料範圍小的變數必須進行強制型別轉換。

強制型別轉換格式:目標資料型別 變數名 = (目標資料型別)值或者變數;

​ 例如:

double num1 = 5.5;
int num2 = (int) num1; // 將double型別的num1強制轉換為int型別
System.out.println(num2); // 輸出5(小數位直接捨棄)

說明:

  1. char型別的資料轉換為int型別是按照碼錶中對應的int值進行計算的。比如在ASCII碼錶中,'a'對應97。
int a = 'a';
System.out.println(a); // 將輸出97
  1. 整數預設是int型別,byte、short和char型別資料參與運算均會自動轉換為int型別。
byte b1 = 10;
byte b2 = 20;
byte b3 = b1 + b2; 
// 第三行程式碼會報錯,b1和b2會自動轉換為int型別,計算結果為int,int賦值給byte需要強制型別轉換。
// 修改為:
int num = b1 + b2;
// 或者:
byte b3 = (byte) (b1 + b2);
  1. boolean型別不能與其他基本資料型別相互轉換。

2. 運算子

2.1 算術運算子(理解)

2.1.1 運算子和表示式

運算子:對常量或者變數進行操作的符號

表示式:用運算子把常量或者變數連線起來符合java語法的式子就可以稱為表示式。

​ 不同運算子連線的表示式體現的是不同型別的表示式。

舉例說明:

int a = 10;
int b = 20;
int c = a + b;

+:是運算子,並且是算術運算子。

a + b:是表示式,由於+是算術運算子,所以這個表示式叫算術表示式。

2.1.2 算術運算子

符號 作用 說明
+ 參看小學一年級
- 參看小學一年級
* 參看小學二年級,與“×”相同
/ 參看小學二年級,與“÷”相同
% 取餘 獲取的是兩個資料做除法的餘數

注意:

/和%的區別:兩個資料做除法,/取結果的商,%取結果的餘數。

整數操作只能得到整數,要想得到小數,必須有浮點數參與運算。

int a = 10;
int b = 3;
System.out.println(a / b); // 輸出結果3
System.out.println(a % b); // 輸出結果1

2.1.3 字元的“+”操作

char型別參與算術運算,使用的是計算機底層對應的十進位制數值。需要我們記住三個字元對應的數值:

'a' -- 97 a-z是連續的,所以'b'對應的數值是98,'c'是99,依次遞加

'A' -- 65 A-Z是連續的,所以'B'對應的數值是66,'C'是67,依次遞加

'0' -- 48 0-9是連續的,所以'1'對應的數值是49,'2'是50,依次遞加

// 可以通過使用字元與整數做算術運算,得出字元對應的數值是多少
char ch1 = 'a';
System.out.println(ch1 + 1); // 輸出98,97 + 1 = 98

char ch2 = 'A';
System.out.println(ch2 + 1); // 輸出66,65 + 1 = 66

char ch3 = '0';
System.out.println(ch3 + 1); // 輸出49,48 + 1 = 49

算術表示式中包含不同的基本資料型別的值的時候,整個算術表示式的型別會自動進行提升。

提升規則:

byte型別,short型別和char型別將被提升到int型別,不管是否有其他型別參與運算。

整個表示式的型別自動提升到與表示式中最高等級的運算元相同的型別

​ 等級順序:byte,short,char --> int --> long --> float --> double

例如:

byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2; // 該行報錯,因為byte型別參與算術運算會自動提示為int,int賦值給byte可能損失精度
int i3 = b1 + b2; // 應該使用int接收
byte b3 = (byte) (b1 + b2); // 或者將結果強制轉換為byte型別
-------------------------------
int num1 = 10;
double num2 = 20.0;
double num3 = num1 + num2; // 使用double接收,因為num1會自動提升為double型別

tips:正是由於上述原因,所以在程式開發中我們很少使用byte或者short型別定義整數。也很少會使用char型別定義字元,而使用字串型別,更不會使用char型別做算術運算。

2.1.4 字串的“+”操作

當“+”操作中出現字串時,這個”+”是字串連線符,而不是算術運算。

System.out.println("itheima"+ 666); // 輸出:itheima666

在”+”操作中,如果出現了字串,就是連線運算子,否則就是算術運算。當連續進行“+”操作時,從左到右逐個執行。

System.out.println(1 + 99 + "年黑馬"); // 輸出:199年黑馬
System.out.println(1 + 2 + "itheima" + 3 + 4); // 輸出:3itheima34
// 可以使用小括號改變運算的優先順序 
System.out.println(1 + 2 + "itheima" + (3 + 4)); // 輸出:3itheima7

2.2 賦值運算子(應用)

賦值運算子的作用是將一個表示式的值賦給左邊,左邊必須是可修改的,不能是常量。

符號 作用 說明
= 賦值 a=10,將10賦值給變數a
+= 加後賦值 a+=b,將a+b的值給a
-= 減後賦值 a-=b,將a-b的值給a
*= 乘後賦值 a*=b,將a×b的值給a
/= 除後賦值 a/=b,將a÷b的商給a
%= 取餘後賦值 a%=b,將a÷b的餘數給a

注意:

擴充套件的賦值運算子隱含了強制型別轉換。

short s = 10;
s = s + 10; // 此行程式碼報出,因為運算中s提升為int型別,運算結果int賦值給short可能損失精度

s += 10; // 此行程式碼沒有問題,隱含了強制型別轉換,相當於 s = (short) (s + 10);

2.3 自增自減運算子(理解)

符號 作用 說明
++ 自增 變數的值加1
-- 自減 變數的值減1

注意事項:

​ ++和-- 既可以放在變數的後邊,也可以放在變數的前邊。

​ 單獨使用的時候, ++和-- 無論是放在變數的前邊還是後邊,結果是一樣的。

​ 參與操作的時候,如果放在變數的後邊,先拿變數參與操作,後拿變數做++或者--。

​ 參與操作的時候,如果放在變數的前邊,先拿變數做++或者--,後拿變數參與操作。

​ 最常見的用法:單獨使用。

int i = 10;
i++; // 單獨使用
System.out.println("i:" + i); // i:11

int j = 10;
++j; // 單獨使用
System.out.println("j:" + j); // j:11

int x = 10;
int y = x++; // 賦值運算,++在後邊,所以是使用x原來的值賦值給y,x本身自增1
System.out.println("x:" + x + ", y:" + y); // x:11,y:10

int m = 10;
int n = ++m; // 賦值運算,++在前邊,所以是使用m自增後的值賦值給n,m本身自增1
System.out.println("m:" + m + ", m:" + m); // m:11,m:11

練習:

int x = 10;
int y = x++ + x++ + x++;
System.out.println(y); // y的值是多少?
/*
解析,三個表示式都是++在後,所以每次使用的都是自增前的值,但程式自左至右執行,所以第一次自增時,使用的是10進行計算,但第二次自增時,x的值已經自增到11了,所以第二次使用的是11,然後再次自增。。。
所以整個式子應該是:int y = 10 + 11 + 12;
輸出結果為33。
*/
注意:通過此練習深刻理解自增和自減的規律,但實際開發中強烈建議不要寫這樣的程式碼!小心捱打!

2.4 關係運算符(應用)

關係運算符有6種關係,分別為小於、小於等於、大於、等於、大於等於、不等於。

符號 說明
== a==b,判斷a和b的值是否相等,成立為true,不成立為false
!= a!=b,判斷a和b的值是否不相等,成立為true,不成立為false
> a>b,判斷a是否大於b,成立為true,不成立為false
>= a>=b,判斷a是否大於等於b,成立為true,不成立為false
< a<b,判斷a是否小於b,成立為true,不成立為false
<= a<=b,判斷a是否小於等於b,成立為true,不成立為false

注意事項:

​ 關係運算符的結果都是boolean型別,要麼是true,要麼是false。

​ 千萬不要把“”誤寫成“=”,""是判斷是否相等的關係,"="是賦值。

int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true

// 關係運算的結果肯定是boolean型別,所以也可以將運算結果賦值給boolean型別的變數
boolean flag = a > b;
System.out.println(flag); // 輸出false

2.5 邏輯運算子(應用)

邏輯運算子把各個運算的關係表示式連線起來組成一個複雜的邏輯表示式,以判斷程式中的表示式是否成立,判斷的結果是 true 或 false。

符號 作用 說明
& 邏輯與 a&b,a和b都是true,結果為true,否則為false
| 邏輯或 a|b,a和b都是false,結果為false,否則為true
^ 邏輯異或 a^b,a和b結果不同為true,相同為false
! 邏輯非 !a,結果和a的結果正好相反
//定義變數
int i = 10;
int j = 20;
int k = 30;

//& “與”,並且的關係,只要表示式中有一個值為false,結果即為false
System.out.println((i > j) & (i > k)); //false & false,輸出false
System.out.println((i < j) & (i > k)); //true & false,輸出false
System.out.println((i > j) & (i < k)); //false & true,輸出false
System.out.println((i < j) & (i < k)); //true & true,輸出true
System.out.println("--------");

//| “或”,或者的關係,只要表示式中有一個值為true,結果即為true
System.out.println((i > j) | (i > k)); //false | false,輸出false
System.out.println((i < j) | (i > k)); //true | false,輸出true
System.out.println((i > j) | (i < k)); //false | true,輸出true
System.out.println((i < j) | (i < k)); //true | true,輸出true
System.out.println("--------");

//^ “異或”,相同為false,不同為true
System.out.println((i > j) ^ (i > k)); //false ^ false,輸出false
System.out.println((i < j) ^ (i > k)); //true ^ false,輸出true
System.out.println((i > j) ^ (i < k)); //false ^ true,輸出true
System.out.println((i < j) ^ (i < k)); //true ^ true,輸出false
System.out.println("--------");

//! “非”,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,輸出true

短路邏輯運算子

符號 作用 說明
&& 短路與 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果

在邏輯與運算中,只要有一個表示式的值為false,那麼結果就可以判定為false了,沒有必要將所有表示式的值都計算出來,短路與操作就有這樣的效果,可以提高效率。同理在邏輯或運算中,一旦發現值為true,右邊的表示式將不再參與運算。

  • 邏輯與&,無論左邊真假,右邊都要執行。

  • 短路與&&,如果左邊為真,右邊執行;如果左邊為假,右邊不執行。

  • 邏輯或|,無論左邊真假,右邊都要執行。

  • 短路或||,如果左邊為假,右邊執行;如果左邊為真,右邊不執行。

int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 兩個表達都會運算
System.out.println(x); // 4
System.out.println(y); // 5

System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經可以確定結果為false,右邊不參與運算
System.out.println(x); // 4
System.out.println(y); // 4

2.6 三元運算子(理解)

三元運算子語法格式:

關係表示式 ? 表示式1 : 表示式2;

解釋:問號前面的位置是判斷的條件,判斷結果為boolean型,為true時呼叫表示式1,為false時呼叫表示式2。其邏輯為:如果條件表示式成立或者滿足則執行表示式1,否則執行第二個。

舉例:

int a = 10;
int b = 20;
int c = a > b ? a : b; // 判斷 a>b 是否為真,如果為真取a的值,如果為假,取b的值

三元運算子案例:

1、需求:動物園裡有兩隻老虎,已知兩隻老虎的體重分別為180kg、200kg,請用程式實現判斷兩隻老虎的體重是否相同。

public class OperatorTest01 {
	public static void main(String[] args) {
		//1:定義兩個變數用於儲存老虎的體重,單位為kg,這裡僅僅體現數值即可。
		int weight1 = 180;
		int weight2 = 200;	
		//2:用三元運算子實現老虎體重的判斷,體重相同,返回true,否則,返回false。
		boolean b = weight1 == weight2 ? true : false;	
		//3:輸出結果
		System.out.println("b:" + b);
	}
}

2、需求:一座寺廟裡住著三個和尚,已知他們的身高分別為150cm、210cm、165cm,請用程式實現獲取這三個和尚的最高身高。

public class OperatorTest02 {
	public static void main(String[] args) {
		//1:定義三個變數用於儲存和尚的身高,單位為cm,這裡僅僅體現數值即可。
		int height1 = 150;
		int height2 = 210;
		int height3 = 165;	
		//2:用三元運算子獲取前兩個和尚的較高身高值,並用臨時身高變數儲存起來。
		int tempHeight = height1 > height2 ? height1 : height2;		
		//3:用三元運算子獲取臨時身高值和第三個和尚身高較高值,並用最大身高變數儲存。
		int maxHeight = tempHeight > height3 ? tempHeight : height3;	
		//4:輸出結果
		System.out.println("maxHeight:" + maxHeight);
	}
}

3. 資料輸入(應用)

我們可以通過 Scanner 類來獲取使用者的輸入。使用步驟如下:

1、導包。Scanner 類在java.util包下,所以需要將該類匯入。導包的語句需要定義在類的上面。

import java.util.Scanner; 

2、建立Scanner物件。

Scanner sc = new Scanner(System.in);// 建立Scanner物件,sc表示變數名,其他均不可變

3、接收資料

int i = sc.nextInt(); // 表示將鍵盤錄入的值作為int數返回。

示例:

import java.util.Scanner;
public class ScannerDemo {
	public static void main(String[] args) {
		//建立物件
		Scanner sc = new Scanner(System.in);
		//接收資料
		int x = sc.nextInt();
		//輸出資料
		System.out.println("x:" + x);
	}
}

改寫三個和尚案例,資料使用鍵盤錄入。

import java.util.Scanner;
public class ScannerTest {
	public static void main(String[] args) {
		//身高未知,採用鍵盤錄入實現。首先導包,然後建立物件。
		Scanner sc = new Scanner(System.in);
		//鍵盤錄入三個身高分別賦值給三個變數。
		System.out.println("請輸入第一個和尚的身高:");
		int height1 = sc.nextInt();
		System.out.println("請輸入第二個和尚的身高:");
		int height2 = sc.nextInt();
		System.out.println("請輸入第三個和尚的身高:");
		int height3 = sc.nextInt();
		//用三元運算子獲取前兩個和尚的較高身高值,並用臨時身高變數儲存起來。
		int tempHeight = height1 > height2 ? height1 : height2;
		//用三元運算子獲取臨時身高值和第三個和尚身高較高值,並用最大身高變數儲存。
		int maxHeight = tempHeight > height3 ? tempHeight : height3;
		//輸出結果。
		System.out.println("這三個和尚中身高最高的是:" + maxHeight +"cm");
	}
}
import java.util.Scanner;
public class IfTest02 {
	public static void main(String[] args) {
		//小明的考試成績未知,可以使用鍵盤錄入的方式獲取值
		Scanner sc = new Scanner(System.in);	
		System.out.println("請輸入一個分數:");
		int score = sc.nextInt();
		//由於獎勵種類較多,屬於多種判斷,採用if...else...if格式實現
		//為每種判斷設定對應的條件
		//為每種判斷設定對應的獎勵	
		//資料測試:正確資料,邊界資料,錯誤資料
		if(score>100 || score<0) {
			System.out.println("你輸入的分數有誤");
		} else if(score>=95 && score<=100) {
			System.out.println("山地自行車一輛");
		} else if(score>=90 && score<=94) {
			System.out.println("遊樂場玩一次");
		} else if(score>=80 && score<=89) {
			System.out.println("變形金剛玩具一個");
		} else {
			System.out.println("胖揍一頓");
		}
	}
}