Java運算子、引用資料型別、流程控制語句
1運算子
1.1算術運算子
運算子是用來計算資料的符號。
資料可以是常量,也可以是變數。
被運算子操作的數我們稱為運算元。
算術運算子最常見的操作就是將運算元參與數學計算:
運算子 |
運算規則 |
範例 |
結果 |
+ |
正號 |
+3 |
3 |
+ |
加 |
2+3 |
5 |
+ |
連線字串 |
“中”+“國” |
“中國” |
- |
負號 |
int a=3;-a |
-3 |
- |
減 |
3-1 |
2 |
* |
乘 |
2*3 |
6 |
/ |
除 |
5/2 |
2 |
% |
取模 |
5/2 |
1 |
++ |
自增 |
int a=1;a++/++a | 2 |
-- |
自減 |
int b=3;a--/--a |
2 |
1.1.1使用算術運算子注意事項
1)加法運算子在連線字串時,只有直接與字串相加才會轉成字串。
例:
class Test01 { public static void main(String[] args) { double a=100L; System.out.println("a的值為:"+a+1); } }
class Test01 { publicstatic void main(String[] args) { double a=100L; System.out.println("a的值為:"+(a+1)); } }
2)除法“/”當兩邊為整數時,取整數部分,舍餘數。當其中一邊為浮點型時,按正常規則相除。
3)“%”為整除取餘符號,小數取餘沒有意義。結果符號與被取餘符號相同。
4)整數做被除數,0不能做除數,否則報錯。
1.2算數運算子++、--的使用
a++:先賦值,自己再加1
++a:自己先加1,再賦值
a--:先賦值,自己再減1
--a:自己先減1,再賦值
示例1:
class Test01 { public static void main(String[] args) { int a = 3; int b = 3; a++; b--; System.out.println(a); System.out.println(b); } }
示例2:
class Test01 { public static void main(String[] args) { int a = 3; int b = 3; ++a; --b; System.out.println(a); System.out.println(b); } }
示例3:
class Test01 { public static void main(String[] args) { int a = 3; int b; b = a++ + 10; System.out.println(a); System.out.println(b); } }
示例4:
class Test01 { public static void main(String[] args) { int a = 3; int b; b = ++a + 10; System.out.println(a); System.out.println(b); } }
1.3賦值運算子
賦值運算子就是為變數賦值的符號
運算子 |
運算規則 |
範例 |
結果 |
|
= |
賦值 |
int a=2 |
2 |
|
+= |
加後賦值 |
int a=2,a+=2,(a=a+2) |
4 |
|
-= |
減後賦值 |
int a=2,a-=2 (a=a-2) |
0 |
|
*= |
乘後賦值 |
int a=2,a*=2 (a=a*2) |
4 |
|
/= |
整除後賦值 |
int a=2,a/=2 |
1 |
|
%= |
取模後賦值 |
int a=2,a%=2 |
0 |
|
注意:諸如+=這樣形式的賦值運算子,會將結果自動強轉成等號左邊的資料型別
例:
class Demo01 { public static void main(String[] args) { //賦值運算子 int a=1; int sum=0; sum+=a; //sum=sum+a System.out.println(sum); } }
1.4比較運算子
比較運算子,又叫關係運算符,它是用來判斷兩個運算元的大小關係及是否相等關係的,結果是布林值true或者false。
運算子 |
運算規則 |
範例 |
結果 |
== |
相等於(判斷) |
4==3 |
False |
!= |
不等於 |
4!=3 |
True |
< |
小於 |
4<3 |
False |
> |
大於 |
4>3 |
True |
<= |
小於等於 |
4<=3 |
False |
>= |
大於等於 |
4>=3 |
True |
注意:
1)Java裡面沒有===
2)賦值運算子的 = 符號與比較運算子的 == 符號是有區別的:
賦值運算子的 = 符號,是用來將 = 符號右邊的值,賦值給 = 符號左邊的變數;
比較運算子的 == 符號,是用來判斷 == 符號 左右變數的值是否相等的。
例:
class Demo01 { public static void main(String[] args) { int a = 3; int b = 4; System.out.println( a=b ); System.out.println( a==b ); } }
1.5邏輯運算子
邏輯運算子,它是用於布林值進行運算的,運算的最終結果為布林值true或false。
運算子 |
運算規則 |
範例 |
結果 |
& |
與 |
false&true |
False |
| |
或 |
false|true |
True |
^ |
異或 |
true^flase |
True |
! |
非(取反) |
!true |
Flase |
&& |
短路與 |
false&&true |
False |
|| |
短路或 |
false||true |
True |
1.5.1
與:一假必假
或:一真必真
異或:兩邊相同為false,不同為true
非:真假相對
短路與:一假必假
短路或:一真必真
1.5.2 &和&&,|和||的區別
&:不管左邊的值是true還是false,右邊都會進行判斷
&&:如果左邊的值是false,則右邊不再判斷
|:不管左邊的值是true還是false,右邊都會進行判斷
||:如果左邊的值是true,則右邊不再判斷
所以實際開發中用&&和||,效率更高
例:
class Demo02 { public static void main(String[] args) { //&和&&區別 int x=1; int y=2; System.out.println(x==y&y==x++); System.out.println(x); System.out.println(y); } }
class Demo02 { public static void main(String[] args) { //&和&&區別 int x=1; int y=2; System.out.println(x==y&&y==x++); System.out.println(x); System.out.println(y); } }
class Demo02 { public static void main(String[] args) { //|和||區別 int x=1; int y=2; System.out.println(x==1|y==x++); System.out.println(x); System.out.println(y); } }
class Demo02 { public static void main(String[] args) { //|和||區別 int x=1; int y=2; System.out.println(x==1||y==x++); System.out.println(x); System.out.println(y); } }
class Demo02 { public static void main(String[] args) { //|和||區別 int x=1; int y=2; System.out.println(x==y||y==x++); System.out.println(x); System.out.println(y); } }
1.6三元運算子
格式:(條件表示式)?表示式1:表示式2;
三元運算子會得到一個結果,通常用於對某個變數進行賦值,當判斷條件成立時,運算結果為表示式1的值,否則結果為表示式2的值。
表示式的概念:通俗的說,即通過使用運算子將運算元聯絡起來的式子,例如:
3+2,使用算數運算子將運算元聯絡起來,稱為算數表示式。
3>2,使用比較運算子(也稱為條件運算子)將運算元聯絡起來,稱為條件表示式。
還有其他一些表示式
例:
class Demo03 { public static void main(String[] args) { //三元運算子 System.out.println(3>2?"正確":"錯誤"); } }
三元運算子就是if,else的簡寫方式,可以提高效率。當兩個條件比較確定時,就可以用三元運算子。三元運算子也可以巢狀。
例:鍵盤錄入三個整數,並將三個資料中的最大值列印在控制檯。
import java.util.Scanner; class e13 { public static void main(String[] args) { //鍵盤錄入三個整數,並將三個資料中的最大值列印在控制檯 Scanner sc=new Scanner(System.in); System.out.println("請輸入第一個整數"); int a=sc.nextInt(); System.out.println("請輸入第二個整數"); int b=sc.nextInt(); System.out.println("請輸入第三個整數"); int c=sc.nextInt(); System.out.println("最大的數是"+(a>b?(a>c?a:c):(b>c?b:c))); } }
1.7運算子優先順序
按照運算先後順序排序(優先順序相同的情況下,按照從左到右的順序依次運算)
優先順序 |
描述 |
運算子 |
1 |
括號 |
()、[] |
2 |
正負號 |
+、- |
3 |
自增自減,非 |
++、--、! |
4 |
乘除,取餘 |
*、/、% |
5 |
加減 |
+、- |
6 |
移位運算 |
<<、>>、>>> |
7 |
大小關係 |
>、>=、<、<= |
8 |
相等關係 |
==、!= |
9 |
按位與 |
& |
10 |
按位異或 |
^ |
11 |
按位或 |
| |
12 |
邏輯與 |
&& |
13 |
邏輯或 |
|| |
14 |
條件運算 |
?: |
15 |
賦值運算 |
=、+=、-=、*=、/=、%= |
16 |
位賦值運算 |
&=、|=、<<=、>>=、>>>= |
1.8例項練習
輸出下圖效果:
知識點:
列印tab空格:System.out.println("\t");
定義字串:String str="字串";
程式碼:
2引用資料型別
Java的資料型別分兩種:
基本資料型別
引用資料型別
2.1引用資料型別的使用
所有的類都是引用資料型別。
與定義基本資料型別變數不同,引用資料型別的變數定義及賦值有一個相對固定的步驟或格式。
資料型別 變數名 = new 資料型別();
每種引用資料型別都有其功能,可以呼叫該型別例項的功能。
變數名.方法名();
2.2 Scanner類
Scanner類是引用資料型別的一種,可以使用該類來完成使用者鍵盤錄入,獲取到錄入的資料。
使用步驟:
1)導包:import java.util.Scanner;
在安裝的jdk目錄中,有一個包檔案,裡面就是java自帶的基礎類庫:
可以看到裡面全是.java檔案
2)建立物件例項:Scanner sc = new Scanner(System.in); //括號裡是傳參
3)呼叫方法:
int i = sc.nextInt(); 用來接收控制檯錄入的數字
String s = sc.next(); 用來接收控制檯錄入的字串
例:
import java.util.Scanner; //導包 class Demo04 { public static void main(String[] args) { //建立Scanner物件 Scanner sc=new Scanner(System.in); //呼叫方法 System.out.println("請輸入一個整數:"); int i=sc.nextInt(); //只能輸入int型別的數字 System.out.println("輸入的整數為:"+i); //輸入double型別的數字 System.out.println("請輸入一個小數:"); double a=sc.nextDouble(); System.out.println("輸入的小數為:"+a); //輸入字串 System.out.println("請輸入一個字串:"); String str=sc.next(); System.out.println("輸入的字串為:"+str); } }
2.3 隨機數類Random
Random類,可以產生多種資料型別的隨機數。
2.3.1使用方式
import導包:所屬包java.util.Random
建立例項格式:Random 變數名 = new Random();
2.3.2方法
public int nextInt(int maxValue) 產生[0,maxValue)範圍的隨機整數,包含0,不包含maxValue;
public double nextDouble() 產生[0,1)範圍的隨機小數,包含0.0,不包含1.0。
例:
import java.util.Random; class Demo05 { public static void main(String[] args) { //建立物件 Random r=new Random(); //呼叫方法 int rand=r.nextInt(5); System.out.println("產生的隨機整數為:"+rand); double doub=r.nextDouble(); System.out.println("產生的隨機小數為:"+doub); } }
//1-10的隨機整數
int num=r.nextInt(10)+1;
System.out.println(num);
3流程控制語句
3.1選擇結構if
3.1.1 if語句
if語句是指如果滿足某種條件,就進行某種處理。
if (條件語句){
執行語句;
……
}
判斷條件是一個布林值,當判斷條件為true時,{}中的執行語句才會執行。
3.1.2 if…else語句
if…else語句是指如果滿足某種條件,就進行某種處理,否則就進行另一種處理。
語法格式:
if (判斷條件){
執行語句1
……
}else{
執行語句2
……
}
判斷條件是一個布林值。當判斷條件為true時,if後面{}中的執行語句1會執行。當判斷條件為false時,else後面{}中的執行語句2會執行。
3.1.3 if…else if…else語句
if…else if…else語句用於對多個條件進行判斷,進行多種不同的處理。
語法格式:
if (判斷條件1) {
執行語句1
} else if (判斷條件2) {
執行語句2
}
...
else if (判斷條件n) {
執行語句n
} else {
執行語句n+1
}
判斷條件是一個布林值。當判斷條件1為true時,if後面{}中的執行語句1會執行。當判斷條件1為false時,會繼續執行判斷條件2,如果為true則執行語句2,以此類推,如果所有的判斷條件都為false,則意味著所有條件均未滿足,else後面{}中的執行語句n+1會執行。
例:
import java.util.Scanner; class Demo06 { public static void main(String[] args) { //使用者輸入一個數 Scanner sc=new Scanner(System.in); System.out.println("請輸入您的分數"); double grade=sc.nextDouble(); //判斷等級 if(grade>=0&&grade<60){ System.out.println("不及格"); }else if(grade>=60&&grade<80){ System.out.println("及格"); }else if(grade>=80&&grade<90){ System.out.println("中等"); }else if(grade>90&&grade<=100){ System.out.println("優秀"); }else{ System.out.println("輸入有誤"); } } }
3.2迴圈語句while
while迴圈語句和選擇結構if語句有些相似,都是根據條件判斷來決定是否執行大括號內的執行語句。區別在於,while語句會反覆地進行條件判斷,只要條件成立,{}內的執行語句就會執行,直到條件不成立,while迴圈結束。
語法結構:
while(迴圈條件){
執行語句
………
}
在上面的語法結構中,{}中的執行語句被稱作迴圈體,迴圈體是否執行取決於迴圈條件。當迴圈條件為true時,迴圈體就會執行。迴圈體執行完畢時會繼續判斷迴圈條件,如條件仍為true則會繼續執行,直到迴圈條件為false時,整個迴圈過程才會結束。
3.3迴圈語句for
for迴圈語句是最常用的迴圈語句,一般用在迴圈次數已知的情況下。
語法格式:
for(初始化表示式; 迴圈條件; 操作表示式){
執行語句
………
}
for關鍵字後面()中包括了三部分內容:初始化表示式、迴圈條件和操作表示式,它們之間用“;”分隔,{}中的執行語句為迴圈體。
用①表示初始化表示式、②表示迴圈條件、③表示操作表示式、④表示迴圈體,
for(① ; ② ; ③){
④
}
第一步,執行①
第二步,執行②,如果判斷結果為true,執行第三步,如果判斷結果為false,執行第五步
第三步,執行④
第四步,執行③,然後重複執行第二步
第五步,退出迴圈
例:
class Demo09 { public static void main(String[] args) { //1到4求和 int sum=0; for(int i=1; i<=4; i++){ sum+=i; } System.out.println("1-4的和為"+sum); } }
3.4迴圈語句do…while
do…while迴圈語句和while迴圈語句功能類似,語法結構:(注意while條件後面的分號)
do {
執行語句
………
} while(迴圈條件);
關鍵字do後面{}中的執行語句是迴圈體。do…while迴圈語句將迴圈條件放在了迴圈體的後面。這也就意味著,迴圈體會無條件執行一次,然後再根據迴圈條件來決定是否繼續執行。
3.5無限迴圈(死迴圈)
最簡單無限迴圈格式:
while(true){}
或
for(;;){}
無限迴圈存在的原因是並不知道迴圈多少次,而是根據某些條件,來控制迴圈。
在cmd控制檯中結束,可以用ctrl+C
3.6迴圈巢狀
巢狀迴圈是指在一個迴圈語句的迴圈體中再定義一個迴圈語句的語法結構。while、do…while、for迴圈語句都可以進行巢狀,並且它們之間也可以互相巢狀,如最常見的在for迴圈中巢狀for迴圈,格式如下:
for(初始化表示式; 迴圈條件; 操作表示式) {
………
for(初始化表示式; 迴圈條件; 操作表示式) {
執行語句
………
}
………
}
一般是用來遍歷資料用的。
例:列印*(外層迴圈控制行,內層控制列)
class Demo01 { public static void main(String[] args) { //列印* for(int i=0;i<4;i++){ for(int j=0;j<=i;j++){ System.out.print("*"); } System.out.println(); } } }
3.7跳轉語句(break、continue)
break:
1)在switch條件語句和迴圈語句中都可以使用break語句。當它出現在switch條件語句中時,作用是終止某個case並跳出switch結構。當它出現在迴圈語句中,作用是跳出迴圈語句,執行後面的程式碼。
2)當break語句出現在巢狀迴圈中的內層迴圈時,它只能跳出內層迴圈,如果想使用break語句跳出外層迴圈則需要對外層迴圈新增標記。
continue:
continue語句用在迴圈語句中,它的作用是終止本次迴圈,執行下一次迴圈。
例1:
class Demo02 { public static void main(String[] args) { //break和continue區別 for(int i=0;i<4;i++){ for(int j=0;j<=i;j++){ if(j==2){ continue; } System.out.print("*"); } System.out.println(); } } }
例2:
class Demo02 { public static void main(String[] args) { //break和continue區別 for(int i=0;i<4;i++){ for(int j=0;j<=i;j++){ if(j==2){ break; } System.out.print("*"); } System.out.println(); } } }
例3:
class Demo03 { public static void main(String[] args) { //加標記 a:for(int i=0;i<4;i++){ for(int j=0;j<=i;j++){ if(j==2){ break a; } System.out.print("*"); } System.out.println(); } } }
例:猜數字
import java.util.Scanner; import java.util.Random; class GuessNumber { public static void main(String[] args) { Scanner sc=new Scanner(System.in); Random r=new Random(); int num=r.nextInt(100)+1; System.out.println("請輸入1到100之間的數"); while(true){ int inNum=sc.nextInt(); if(inNum>num){ System.out.println("猜大了,請重輸"); }else if(inNum<num){ System.out.println("猜小了,請重輸"); }else{ System.out.println("猜對了"); break; } } } }
4 流程控制語句
switch 條件語句也是一種很常用的選擇語句,它和if條件語句不同,它只能針對某個表示式的值作出判斷,從而決定程式執行哪一段程式碼。
4.1 if和switch區別
if的條件,可以是一個範圍
switch的條件只能是一個值
4.2基本語法格式
switch (表示式){
case 目標值1:
執行語句1
break;
case 目標值2:
執行語句2
break;
......
case 目標值n:
執行語句n
break;
default:
執行語句n+1
break;
}
例:
import java.util.Scanner; class Demo033 { public static void main(String[] args) { //如果使用者輸入1-5,顯示工作日;輸入6和7,顯示休息日 Scanner sc=new Scanner(System.in); int day=sc.nextInt(); switch(day){ case 1: System.out.println("工作日"); break; case 2: System.out.println("工作日"); break; case 3: System.out.println("工作日"); break; case 4: System.out.println("工作日"); break; case 5: System.out.println("工作日"); break; case 6: System.out.println("休息日"); break; case 7: System.out.println("休息日"); break; default: System.out.println("輸入有誤"); break; } } }
4.3注意
1)default可以放在任意的位置,所以最好加一個break
2)穿透性,如果case後面沒有break,則會繼續執行下一個case中的語句(不論條件是否還滿足),直到遇到break才跳出。
3)在switch語句中的表示式只能是byte、short、int、char(注意沒有double)
型別的值,如果傳入其它型別的值,程式會報錯。
在JDK5.0中引入的新特性enum列舉也可以作為switch語句表示式的值,
在JDK7.0中也引入了新特性,switch語句可以接收一個String型別的值。
例:
import java.util.Scanner; class Demo033 { public static void main(String[] args) { //如果使用者輸入1-5,顯示工作日;輸入6和7,顯示休息日 Scanner sc=new Scanner(System.in); int day=sc.nextInt(); //利用穿透,簡化程式碼 switch(day){ case 1: case 2: case 3: case 4: case 5: System.out.println("工作日"); break; case 6: case 7: System.out.println("休息日"); break; default: System.out.println("輸入有誤"); break; } } }