Java基礎(chǔ)語(yǔ)法
計(jì)算機(jī)基礎(chǔ)
1.什么是二進(jìn)制?
2.什么是字節(jié)?
3.命令提示符
Java語(yǔ)言基礎(chǔ)
JRE和JDK、JVM
關(guān)鍵字和標(biāo)識(shí)符
常量和變量
數(shù)據(jù)類型轉(zhuǎn)換
運(yùn)算符
程序流程
方法
Java基礎(chǔ)語(yǔ)法
計(jì)算機(jī)基礎(chǔ)
1.什么是二進(jìn)制?
二進(jìn)制數(shù)只包含0和1,每一個(gè)0或者1都是一個(gè)bit(位)。
我們常用的十進(jìn)制如何轉(zhuǎn)換成二進(jìn)制:
2.什么是字節(jié)?
我們知道計(jì)算機(jī)中的數(shù)據(jù)都是由1或者0組成,每個(gè)0或1都是一個(gè)bit,每8個(gè)bit就是一個(gè)字節(jié)(byte)。
字節(jié)是數(shù)據(jù)存儲(chǔ)的最小單位。
1 TB = 1024 GB---->1 GB = 1024 MB ---->1 MB = 1024 KB---->1 KB = 1024 B
3.命令提示符
啟動(dòng):win+R
切換盤符: 盤符:
退出:exit
進(jìn)入文件夾:cd+文件夾名稱
查看目錄:dir
清屏:cls
進(jìn)入多級(jí)文件夾: cd+\IdeaProjects\javaBasic\java
返回上一層:cd…
返回根目錄:cd </br>
Java語(yǔ)言基礎(chǔ)
JRE和JDK、JVM
JRE(Java Runtime Enviroment),Java運(yùn)行環(huán)境,如果只是需要在該計(jì)算機(jī)上運(yùn)行Java應(yīng)用,那么只需要安裝JRE即可。
JDK(Java Development Kit),如果想要開(kāi)發(fā),就必須安裝JDK。
特別注意:JDK安裝路徑最好不要有空格或者中文。
關(guān)鍵字和標(biāo)識(shí)符
關(guān)鍵字的特點(diǎn):
- 完全小寫(xiě)的字母
- 在增強(qiáng)版的記事本或者IDE中有特殊的顏色
標(biāo)識(shí)符:自己命名的類名,方法名等。
命名規(guī)則:
- 由字母、數(shù)字、下劃線、美元符號(hào)組成
- 不能由數(shù)字開(kāi)頭
- 不能是Java保留字
常量和變量
常量
什么是常量?
常量就是在程序運(yùn)行期間,不會(huì)改變的量。
常量的分類
字符串常量:凡是用雙引號(hào)括起來(lái)的都是字符串常量,例如:“abc”,“110”,“Hello”…
字符常量:凡是用單引號(hào)括起來(lái)的單個(gè)字符,就叫字符常量。例如:‘A’,‘a(chǎn)’,‘1’,‘張’
整型常量:直接寫(xiě)上的數(shù)字,沒(méi)有小數(shù)點(diǎn)。例如:123,200,-23
浮點(diǎn)型常量:直接寫(xiě)上的數(shù)字,有小數(shù)點(diǎn)。例如:3.14,0.0
布爾常量:true或false
空常量:null。代表沒(méi)有任何數(shù)據(jù)
public class Demo01Const{
public static void main(String[] args){
// 字符串常量
System.out.println("ABC");
System.out.println("");
System.out.println("XYZ");
// 整數(shù)常量
System.out.println(50);
System.out.println(-30);
// 浮點(diǎn)常量
System.out.println(3.14);
System.out.println(0.0);
System.out.println(-24.0);
// 字符常量
System.out.println('A');
System.out.println('a');
//System.out.println('');單引號(hào)中間有且僅有一個(gè)字符,沒(méi)有不行,編譯出錯(cuò)
// 布爾常量
System.out.println(true);
System.out.println(false);
//空常量 null,不能直接打印
}
}
數(shù)據(jù)類型
數(shù)據(jù)類型分為兩類:
- 基本數(shù)據(jù)類型:整型,浮點(diǎn)型,布爾型,字符型
- 引用數(shù)據(jù)類型:字符串,數(shù)組,類,接口,Lamda
基本數(shù)據(jù)類型:
整型:byte,short,int,long
浮點(diǎn)型:float,double
字符型:char
布爾型:boolean
基本數(shù)據(jù)類型注意事項(xiàng):
1.字符串不是基本數(shù)據(jù)類型,而是引用類型。
2.浮點(diǎn)型可能是一個(gè)近似值,而不是精確值。
3.數(shù)據(jù)范圍不一定與字節(jié)數(shù)相關(guān),例如float的范圍比long要廣,但是它只占4個(gè)字節(jié)。
4.浮點(diǎn)數(shù)默認(rèn)是double類型,要使用float類型,需要加上后綴F/f,但是建議使用F。
5.整數(shù)默認(rèn)為int類型,要使用long類型,需要加上后綴L/l,但是建議使用L。
public class Demo01DataType{
public static void main(String[] args){
System.out.println(1024);//默認(rèn)是int類型
System.out.println(3.14);//默認(rèn)是double類型
//左邊是long類型,右邊是int類型,數(shù)據(jù)類型不一致,會(huì)發(fā)生數(shù)據(jù)轉(zhuǎn)換,
//int類型數(shù)據(jù)范圍比long類型數(shù)據(jù)范圍小,可以發(fā)生自動(dòng)類型轉(zhuǎn)換
long num1 = 10;
System.out.println(num1);
//左邊是double類型,右邊是float類型,數(shù)據(jù)類型不一致,可以發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//float---->double float數(shù)據(jù)范圍比double小,可以是發(fā)生自動(dòng)類型轉(zhuǎn)換
double num2 = 2.5F;
System.out.println(num2);
//左邊是float類型,右邊是long類型,數(shù)據(jù)類型不一致,可以發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//long---->float long類型數(shù)據(jù)范圍比f(wàn)loat類型小,可以發(fā)生自動(dòng)類型轉(zhuǎn)換
float num3 = 30L;
System.out.println(num3);//30.0
}
}
變量
什么是變量?
就是在程序運(yùn)行期間,會(huì)發(fā)生改變的量。
創(chuàng)建一個(gè)變量的格式
① 數(shù)據(jù)類型 變量名稱;//創(chuàng)建一個(gè)變量
變量名稱 = 數(shù)據(jù)值;//賦值,將右邊的數(shù)據(jù)值,賦值給左邊的變量
② 數(shù)據(jù)類型 變量名稱 = 數(shù)據(jù)值;
public class Demo02Variable{
public static void main(String[] args){
//使用格式①創(chuàng)建變量
int num1;
num1=1;
System.out.println(num1);
//改變變量當(dāng)中的值
num1=20;
System.out.println(num1);
//使用格式②
int num2 = 5;
System.out.println(num2);
//byte num3 = 129;
//System.out.println(num3);
byte num3 = 64;
System.out.println(num3);//64
short num4 = 400;
System.out.println(num4);//400
long num5 = 3000000000L;
System.out.println(num5);//3000000000
float num6 = 3.2444F;
System.out.println(num6);//3.2444
double num7 = 3.14;
System.out.println(num7);//3.14
char ch1 = 'A';
System.out.println(ch1);//A
char ch2 = '2';
System.out.println(ch2);//2
char ch3 = '我';
System.out.println(ch3);//我
boolean b1 = true;
System.out.println(b1);//true
b1 = false;
System.out.println(b1);//false
boolean b2 = b1;
System.out.println(b2);//false
}
}
使用變量的注意事項(xiàng)
- 變量的命名不能重復(fù)。
- 在使用byte和short的時(shí)候要注意它們的范圍,如果超出范圍會(huì)編譯錯(cuò)誤。
- 在使用float和long類型時(shí),注意要加后綴。
- 變量的使用不能超出其作用域。(作用域:就是從變量命名的地方開(kāi)始,直到該變量直接所屬的大括號(hào)結(jié)束為止)
- 沒(méi)有進(jìn)行賦值的變量不能直接使用。
- 可以直接定義多個(gè)變量,但是不建議使用。
public class Demo03VariableNotice{
public static void main(String[] args){
int num1 = 10;
System.out.println(num1);
//int num1 = 20;錯(cuò)誤,變量名不能重復(fù)。
float num2 = 3.14F;//如果不加F會(huì)產(chǎn)生錯(cuò)誤。
System.out.println(num2);
long num3 = 30000000000L;
System.out.println(num3);
//byte num4 = 128; 注意byte的范圍是-128~127,不能超出范圍
byte num4 = 12;
System.out.println(num4);
short num5 = 400;
System.out.println(num5);
//沒(méi)有賦值的變量不能使用
//int num6;
//System.out.println(num6);
//此時(shí)還沒(méi)有命名變量,無(wú)法使用。
//System.out.println(num6);
int num6 = 2;
System.out.println(num6);
//可以這么使用,但是不建議。
int a = 10,b = 20,c = 30;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
數(shù)據(jù)類型轉(zhuǎn)換
什么是數(shù)據(jù)類型轉(zhuǎn)換?
當(dāng)數(shù)據(jù)類型不一樣時(shí),就會(huì)發(fā)生數(shù)據(jù)類型轉(zhuǎn)換。
數(shù)據(jù)類型轉(zhuǎn)換的分類:
- 自動(dòng)類型轉(zhuǎn)換(隱式):
①特點(diǎn):代碼不需要進(jìn)行處理,自動(dòng)完成
②規(guī)則:數(shù)據(jù)范圍由小到大
public class Demo01DataType{
public static void main(String[] args){
System.out.println(1024);//默認(rèn)是int類型
System.out.println(3.14);//默認(rèn)是double類型
//左邊是long類型,右邊是int類型,數(shù)據(jù)類型不一致,會(huì)發(fā)生數(shù)據(jù)轉(zhuǎn)換,
//int類型數(shù)據(jù)范圍比long類型數(shù)據(jù)范圍小,可以發(fā)生自動(dòng)類型轉(zhuǎn)換
long num1 = 10;
System.out.println(num1);
//左邊是double類型,右邊是float類型,數(shù)據(jù)類型不一致,可以發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//float---->double float數(shù)據(jù)范圍比double小,可以是發(fā)生自動(dòng)類型轉(zhuǎn)換
double num2 = 2.5F;
System.out.println(num2);
//左邊是float類型,右邊是long類型,數(shù)據(jù)類型不一致,可以發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//long---->float long類型數(shù)據(jù)范圍比f(wàn)loat類型小,可以發(fā)生自動(dòng)類型轉(zhuǎn)換
float num3 = 30L;
System.out.println(num3);//30.0
}
}
2.強(qiáng)制類型轉(zhuǎn)換(顯式):
①特點(diǎn):代碼需要進(jìn)行格式處理,不能自動(dòng)完成
②格式:數(shù)據(jù)類型 變量名稱 = (范圍小的類型)原本范圍大的數(shù)據(jù)
注意事項(xiàng):
- 強(qiáng)制類型轉(zhuǎn)換有可能導(dǎo)致精度丟失、數(shù)據(jù)溢出等。
- byte、short、char類型都可以進(jìn)行數(shù)學(xué)運(yùn)算。
- byte、short、char類型在進(jìn)行數(shù)學(xué)運(yùn)算時(shí),都被提升成了int類型,再進(jìn)行計(jì)算。
- boolean類型不能進(jìn)行數(shù)據(jù)轉(zhuǎn)換。
public class Demo02DataType{
public static void main(String[] args){
//左邊是int類型,右邊是long類型,會(huì)發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//long---->int ,long類型范圍比int類型大,不能發(fā)生自動(dòng)類型轉(zhuǎn)換,需要強(qiáng)制類型轉(zhuǎn)換
//進(jìn)行格式處理: 范圍小的數(shù)據(jù)類型 范圍小的變量名 = (范圍小的數(shù)據(jù)類型)原本范圍大的數(shù)據(jù);
int num =(int)100L;
System.out.println(num);
//左邊是int類型,右邊是long類型,會(huì)發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//long--->int long比int范圍要大,所以發(fā)生強(qiáng)制類型轉(zhuǎn)換
//但是發(fā)生了數(shù)據(jù)溢出,因?yàn)閕nt類型裝不下6000000000
int num1 = (int) 6000000000L;
System.out.println(num1);//1705032704
//float---->int 強(qiáng)制轉(zhuǎn)換,發(fā)生精度丟失,這里不是四舍五入
int num2 = (int) 3.99F;
System.out.println(num2);//3
//我們都知道計(jì)算機(jī)底層都是二進(jìn)制數(shù),所以A也是以二進(jìn)制數(shù)的形式來(lái)存儲(chǔ),
char ch1 = 'A';
System.out.println(ch1+1);//66 證明這里的'A'被當(dāng)做65來(lái)進(jìn)行運(yùn)算
byte b1 = 40;
byte b2 = 50;
int result1 = b1+b2;//會(huì)報(bào)錯(cuò),不兼容的類型。原因:就是第三個(gè)注意事項(xiàng),當(dāng)進(jìn)行數(shù)學(xué)運(yùn)算時(shí),b1和b2都已經(jīng)被提升成了int類型,左右兩邊類型不一致
//需要發(fā)生強(qiáng)制類型轉(zhuǎn)換,所以把result1的類型轉(zhuǎn)換成int
System.out.println(result1);
short s1 = 60;
//short result2 = b1+s1; 同上,會(huì)報(bào)錯(cuò),如果想要的結(jié)果是short類型,那么必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換
short result2 =(short)(b1+s1);
System.out.println(result2);
}
}
ASCII碼表
什么是ASCII碼表?
ASCII:American Standard Code of Information Inchange 美國(guó)信息交換標(biāo)準(zhǔn)代碼
還有Unicode表,就是數(shù)字和字符的對(duì)照關(guān)系表。
public class Demo03DataTypeChar{
public static void main(String[] args){
char ch1 = '1';
System.out.println(ch1+0);
char ch2 = 'A';
System.out.println(ch2+2);//67
//左邊是int類型,右邊是char類型,左右不一致,發(fā)生數(shù)據(jù)類型轉(zhuǎn)換
//char---->int 范圍小向范圍大轉(zhuǎn)換,自動(dòng)轉(zhuǎn)換,不需要強(qiáng)制類型轉(zhuǎn)換
int num = 'c';
System.out.println(num);//99
int ch3 = '中';
System.out.println(ch3);//20013
}
}
運(yùn)算符
什么是運(yùn)算符?
就是進(jìn)行特定操作的符號(hào)。
什么是表達(dá)式?
就是用運(yùn)算符連接起來(lái)的式子。
四則運(yùn)算符和加號(hào)的特定用法
四則運(yùn)算符,+,-,*,/,%;其中包括加,減,乘,除,%代表取模,即取余數(shù)。
public class Demo04Operator{
public static void main(String[] args){
System.out.println(20+30);//50
int a = 10;
int b = 20;
//會(huì)先計(jì)算表達(dá)式的值,再進(jìn)行打印
System.out.println(a-b);//-10
System.out.println(a*10);//100
//除法,只看商
int result1 = 10/3;
System.out.println(result1);//3
//如果想要獲得余數(shù),用取模運(yùn)算
int x = 14;
int y = 3;
int result2 = x%y;
System.out.println(result2);//2
//int + double ---->double + double ----->double
double result3 = x + 2.5;
System.out.println(result3);//16.5
}
}
"+"常見(jiàn)的三種用法:
- 正常的加法運(yùn)算
- 對(duì)于char類型來(lái)說(shuō),在計(jì)算前會(huì)被提升為int類型
- 用于連接字符串(注意事項(xiàng):任何數(shù)據(jù)類型和字符串相連接,都會(huì)變成字符串)
public class Demo05Plus{
public static void main(String[] args){
String str1 = "Hello";
System.out.println("Hello");
System.out.println("Hello"+"World");//HelloWorld
String str2 = "Java";
//String + int --->String + String ---->String
System.out.println(str1+20);//Java20
System.out.println(str1+20+30);//Java2030
System.out.println(str1+(20+30));//Java50
}
}
自增、自減運(yùn)算符
使用方式:++可以在前,也可以在后,例如:++n或者n++。
使用區(qū)別:
1.單獨(dú)使用:++在前和在后沒(méi)有任何區(qū)別,獨(dú)自形成一個(gè)步驟(前提是不與任何其他操作混合)
2.混合使用:當(dāng)混合使用時(shí),++在前和在后有【重大區(qū)別】:
a.++在前時(shí),變量立刻+1,然后再參與其他運(yùn)算 【先加后用】
b.++在后時(shí),變量首先按照原來(lái)的值參與其他運(yùn)算,然后再+1 【先用后加】
注意事項(xiàng):只有是變量才能使用自增、自減符號(hào),常量無(wú)法使用。
public class Demo06Operator{
public static void main(String[] args){
//單獨(dú)使用的情況,沒(méi)有區(qū)別
int num1 = 10;
++num1;
System.out.println(num1);//11
int num2 = 20;
num2++;
System.out.println(num2);//21
System.out.println("==============================================================");
//混合使用,例如與打印操作混合
int num3 = 30;
System.out.println(++num3);//31
System.out.println(num3);//31
int num4 = 40;
System.out.println(num4++);//40
System.out.println(num4);//41
System.out.println("==============================================================");
//和賦值操作混合
int num5 = 50;
int result1 = num5++;
System.out.println(result1);//50
System.out.println(num5);//51
int num6 = 60;
int reuslt2 = --num6;
System.out.println(reuslt2);//59
System.out.println(num6);//59
System.out.println("==============================================================");
int x = 10;
int y = 20;
int result = --x + y++;
System.out.println(result);//29
System.out.println(x);//9
System.out.println(y);//21
//30++; //只有變量才能自增或自減,常量使用會(huì)編譯報(bào)錯(cuò)。
}
}
賦值運(yùn)算符
1.基本賦值運(yùn)算符
就是=,代表把右邊的數(shù)據(jù)值賦值給左邊的變量
2.復(fù)合賦值運(yùn)算符
+=: a += 5 相當(dāng)于 a = a + 5;
-=: a -= 5 相當(dāng)于 a = a - 5;
*=: a *= 5 相當(dāng)于 a = a * 5;
/=: a /= 5 相當(dāng)于 a = a / 5;
%=: a += 5 相當(dāng)于 a = a % 5;
注意事項(xiàng):
1.只有變量可以使用復(fù)合賦值運(yùn)算,常量不可以使用。
2.復(fù)合賦值運(yùn)算實(shí)際含有一個(gè)隱式的數(shù)據(jù)類型轉(zhuǎn)換。
public class Demo07Operator{
public static void main(String[] args){
int a = 10;
a += 5;
System.out.println(a);//15
int b = 13;
b %= 4;
System.out.println(b);//1
//復(fù)合賦值運(yùn)算中隱含了一個(gè)強(qiáng)制類型轉(zhuǎn)換
byte x = 12;
//x += 5;
//相當(dāng)于 x = x + 5;
// byte = byte + int ;
//byte = int + int ;
//byte = int ;
//byte = (byte)int;
x += 5;
System.out.println(x);//17
}
}
比較運(yùn)算符
比較運(yùn)算符: > , < , >= , <= , == ,!=;
注意事項(xiàng):
1.比較運(yùn)算符的結(jié)果一定是boolean類型。
2.如果進(jìn)行多次判斷,不能像數(shù)學(xué)中連寫(xiě),如1<x<3,這樣會(huì)編譯報(bào)錯(cuò)。
public class Demo08Operator{
public static void main(String[] args){
int x = 10;
int y = 20;
System.out.println(x > y);//false
System.out.println(x < y);//true;
System.out.println(x >= 100);//false
System.out.println(x <= 10);//true;
System.out.println(10 == 10);//true
System.out.println(20 != 20);//false
}
}
邏輯運(yùn)算符
與:&&;
或:||;
非:!;
與、或具有短路效果:就是根據(jù)左邊的表達(dá)式已經(jīng)能夠判斷出結(jié)果,那么后邊的表達(dá)式將不再運(yùn)行,節(jié)省性能。
public class Demo09Logic{
public static void main(String[] args){
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(3 < 4 && 10 < 100);//true
System.out.println(true || true);//true
System.out.println(true || false);//true
System.out.println(false || false);//false
System.out.println(!true);//false
System.out.println(!false);//true
System.out.println("======================");
//短路效果:
int a = 10;
System.out.println(3 > 4 && ++a > 1);//false
System.out.println(a);//10
int b = 20;
System.out.println(3 < 4 || b++ > 1);//true
System.out.println(b);//20
}
}
三元運(yùn)算符
格式:
數(shù)據(jù)類型 變量名稱 = 條件判斷 ? 表達(dá)式A : 表達(dá)式B;
注意事項(xiàng):
1.表達(dá)式A和表達(dá)式B必須同時(shí)滿足左邊的數(shù)據(jù)類型,否則編譯報(bào)錯(cuò)。
2.三元運(yùn)算符的結(jié)果必須被使用,要么賦值,要么打印等,不能獨(dú)立存在
public class Demo10Operator{
public static void main(String[] args){
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println("最大值是:" + max);//20
//注意事項(xiàng)1:
//int max = 3 > 4 ? 2.5 : 10;//錯(cuò)誤寫(xiě)法,必須同時(shí)滿足左邊的int類型
//注意事項(xiàng)2:
System.out.println(a > b ? a : b);//正確寫(xiě)法 將會(huì)打印20
//a > b ? a : b;錯(cuò)誤寫(xiě)法,編譯報(bào)錯(cuò)
}
}
程序流程
順序結(jié)構(gòu)
#### 選擇結(jié)構(gòu) ####
1.單if語(yǔ)句
public class Demo02If{
public static void main(String[] args){
System.out.println("今天我準(zhǔn)備去網(wǎng)吧");
int age = 17;
if(age >= 18){
System.out.println("年齡滿18才能進(jìn)入網(wǎng)吧");
}
System.out.println("回家");
}
}
public class Demo03IfElse{
public static void main(String[] args){
int age = 20;
if(age >= 18){
System.out.println("可以進(jìn)入網(wǎng)吧");
}else{
System.out.println("不能進(jìn)入網(wǎng)吧");
}
}
}
public class Demo04IfElseExt{
public static void main(String[] args){
int x = 15;
int y;
if(x >= 3){
y = 2*x+1;
} else if (-1 < x && x < 3){
y = 2*x;
} else {
y = 2*x-1;
}
System.out.println("結(jié)果是"+ y);
}
}
4.標(biāo)準(zhǔn)的switch語(yǔ)句
public class Demo07Switch{
public static void main(String[] args){
int num = 4;
switch(num){
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("數(shù)據(jù)不合理");
break;//不寫(xiě)這個(gè)break不會(huì)報(bào)錯(cuò),但是強(qiáng)烈建議寫(xiě)上。
}
}
}
switch case注意事項(xiàng):
①case后面的數(shù)值不能重復(fù)
②case后面可以是基本類型也可以是引用類型:
基本類型:byte,short,char,int
引用類型: String,enum
public class Demo08SwitchNotice{
public static void main(String[] args){
int num = 3;
switch(num){
case 2:
System.out.println("BBB");
break;
case 3:
System.out.println("AAA");
case 1:
System.out.println("CCC");
break;
default:
System.out.println("DDD");
break;
}
System.out.println("具有穿透功能的switch");
}
}
循環(huán)結(jié)構(gòu)
1.for循環(huán)
/*
循環(huán)結(jié)構(gòu):
for循環(huán)
for(初始化語(yǔ)句①;條件判斷②;步進(jìn)語(yǔ)句④){
循環(huán)體③
}
*/
public class Demo09For{
public static void main(String[] args){
for(int i=1;i<=100;i++){
System.out.println("我錯(cuò)了!請(qǐng)?jiān)徫野眩?+i);
}
}
}
2.while循環(huán)
/*
while循環(huán):
標(biāo)準(zhǔn)格式:
while(條件判斷){
循環(huán)體
}
擴(kuò)展格式:
初始化語(yǔ)句;
while(條件判斷){
循環(huán)體;
步進(jìn)語(yǔ)句;
}
*/
public class Demo10While{
public static void main(String[] args){
int i = 1;
while(i<=10){
System.out.println("我錯(cuò)了!"+ i );
i++;
}
}
}
3.do-while循環(huán)
/*
doWhile循環(huán)
do{
循環(huán)體
步進(jìn)語(yǔ)句
}while(條件判斷)
dowhile循環(huán)一上來(lái)就先執(zhí)行一次do里面的內(nèi)容,再進(jìn)行條件判斷是否繼續(xù)循環(huán)
*/
public class Demo11DoWhile{
public static void main(String[] args){
int i = 1;
do{
System.out.println("起來(lái)吧,原諒你了");
i++;
}while(i <= 10);
}
}
4.條件控制語(yǔ)句
break:
①在switch語(yǔ)句中使用,一旦執(zhí)行,整個(gè)switch將被打斷
②在循環(huán)中使用,一旦執(zhí)行,整個(gè)循環(huán)被打斷
public class Demo13Break{
public static void main(String[] args){
for(int i=1;i<=10;i++){
if(i==4){
break;
}
System.out.println("hello"+i);
}
}
}
continue:
在循環(huán)中使用,一旦執(zhí)行,表示跳出當(dāng)次循環(huán),繼續(xù)下一次循環(huán)
public class Demo14Continue{
public static void main(String[] args){
for(int i = 1;i <= 10;i++){
if(i == 4){
continue;
}
System.out.println(i+"層到了");
}
}
break和continue的區(qū)別:
break是打斷,終止整個(gè)循環(huán)結(jié)構(gòu),執(zhí)行break后將不再執(zhí)行任何循環(huán)體內(nèi)容。
continue是跳出當(dāng)次循環(huán),繼續(xù)下一次循環(huán),執(zhí)行continue后,循環(huán)還可以繼續(xù)。
5.死循環(huán)
public class Demo15DeadLoop{
public static void main(String[] args){
while(true){
System.out.println("I love Java!");
}
//System.out.println("hello");這是錯(cuò)誤寫(xiě)法,循環(huán)不結(jié)束,這句話不會(huì)執(zhí)行,會(huì)編譯報(bào)錯(cuò)
}
}
6.循環(huán)嵌套
public class Demo16LoopHourAndMinute {
public static void main(String[] args){
for(int hour = 0 ;hour < 24;hour++){
for(int minute = 1;minute < 60;minute++){
System.out.println( hour + "點(diǎn)" + minute + "分");
}
}
}
}
方法
1.方法的定義
定義格式:
public static void 方法名稱() {
方法體
}
調(diào)用格式:方法名稱();
注意事項(xiàng):
- 方法定義的先后順序無(wú)所謂。
- 方法定義必須是挨著的,不能在一個(gè)方法的內(nèi)部定義另外一個(gè)方法。
- 方法定義之后,自己不會(huì)執(zhí)行的;如果希望執(zhí)行,一定要進(jìn)行方法的調(diào)用。
public class Demo01Method {
public static void main(String[] args) {
printMethod();
}
public static void printMethod() {
for (int j = 0; j < 5; j++) {
for (int i = 0; i < 20; i++) {
System.out.print("*");
}
System.out.println();
}
}
}
2.方法
方法其實(shí)就是若干語(yǔ)句的功能集合。
方法好比是一個(gè)工廠。
蒙牛工廠 原料:奶牛、飼料、水
產(chǎn)出物:奶制品
鋼鐵工廠 原料:鐵礦石、煤炭
產(chǎn)出物:鋼鐵建材
參數(shù)(原料):就是進(jìn)入方法的數(shù)據(jù)。
返回值(產(chǎn)出物):就是從方法中出來(lái)的數(shù)據(jù)。
定義方法的完整格式:
修飾符 返回值類型 方法名稱(參數(shù)類型 參數(shù)名稱, …) {
方法體
return 返回值;
}
修飾符:現(xiàn)階段的固定寫(xiě)法,public static
返回值類型:也就是方法最終產(chǎn)生的數(shù)據(jù)結(jié)果是什么類型
方法名稱:方法的名字,規(guī)則和變量一樣,小駝峰
參數(shù)類型:進(jìn)入方法的數(shù)據(jù)是什么類型
參數(shù)名稱:進(jìn)入方法的數(shù)據(jù)對(duì)應(yīng)的變量名稱
PS:參數(shù)如果有多個(gè),使用逗號(hào)進(jìn)行分隔
方法體:方法需要做的事情,若干行代碼
return:兩個(gè)作用,第一停止當(dāng)前方法,第二將后面的返回值還給調(diào)用處
返回值:也就是方法執(zhí)行后最終產(chǎn)生的數(shù)據(jù)結(jié)果
注意:return后面的“返回值”,必須和方法名稱前面的“返回值類型”,保持對(duì)應(yīng)。
定義一個(gè)兩個(gè)int數(shù)字相加的方法。三要素:
返回值類型:int
方法名稱:sum
參數(shù)列表:int a, int b
方法的三種調(diào)用格式。
- 單獨(dú)調(diào)用:方法名稱(參數(shù));
- 打印調(diào)用:System.out.println(方法名稱(參數(shù)));
- 賦值調(diào)用:數(shù)據(jù)類型 變量名稱 = 方法名稱(參數(shù));
注意:此前學(xué)習(xí)的方法,返回值類型固定寫(xiě)為void,這種方法只能夠單獨(dú)調(diào)用,不能進(jìn)行打印調(diào)用或者賦值調(diào)用。
public class Demo02MethodDefine {
public static void main(String[] args) {
// 單獨(dú)調(diào)用
sum(10, 20);
System.out.println("===========");
// 打印調(diào)用
System.out.println(sum(10, 20)); // 30
System.out.println("===========");
// 賦值調(diào)用
int number = sum(15, 25);
number += 100;
System.out.println("變量的值:" + number); // 140
}
public static int sum(int a, int b) {
System.out.println("方法執(zhí)行啦!");
int result = a + b;
return result;
}
}
3.方法的參數(shù)
有參數(shù):小括號(hào)當(dāng)中有內(nèi)容,當(dāng)一個(gè)方法需要一些數(shù)據(jù)條件,才能完成任務(wù)的時(shí)候,就是有參數(shù)。
例如兩個(gè)數(shù)字相加,必須知道兩個(gè)數(shù)字是各自多少,才能相加。
無(wú)參數(shù):小括號(hào)當(dāng)中留空。一個(gè)方法不需要任何數(shù)據(jù)條件,自己就能獨(dú)立完成任務(wù),就是無(wú)參數(shù)。
例如定義一個(gè)方法,打印固定10次HelloWorld。
public class Demo03MethodParam {
public static void main(String[] args) {
method1(10, 20);
System.out.println("==============");
method2();
}
// 兩個(gè)數(shù)字相乘,做乘法,必須知道兩個(gè)數(shù)字各自是多少,否則無(wú)法進(jìn)行計(jì)算
// 有參數(shù)
public static void method1(int a, int b) {
int result = a * b;
System.out.println("結(jié)果是:" + result);
}
// 例如打印輸出固定10次文本字符串
public static void method2() {
for (int i = 0; i < 10; i++) {
System.out.println("Hello, World!" + i);
}
}
}
4.return語(yǔ)句
/*
題目要求:定義一個(gè)方法,用來(lái)【求出】?jī)蓚(gè)數(shù)字之和。(你幫我算,算完之后把結(jié)果告訴我。)
題目變形:定義一個(gè)方法,用來(lái)【打印】?jī)蓚(gè)數(shù)字之和。(你來(lái)計(jì)算,算完之后你自己負(fù)責(zé)顯示結(jié)果,不用告訴我。)
注意事項(xiàng):
對(duì)于有返回值的方法,可以使用單獨(dú)調(diào)用、打印調(diào)用或者賦值調(diào)用。
但是對(duì)于無(wú)返回值的方法,只能使用單獨(dú)調(diào)用,不能使用打印調(diào)用或者賦值調(diào)用。
*/
public class Demo04MethodReturn {
public static void main(String[] args) {
// 我是main方法,我來(lái)調(diào)用你。
// 我調(diào)用你,你來(lái)幫我計(jì)算一下,算完了之后,把結(jié)果告訴我的num變量
int num = getSum(10, 20);
System.out.println("返回值是:" + num);
System.out.println("==============");
printSum(100, 200);
System.out.println("==============");
System.out.println(getSum(2, 3)); // 正確寫(xiě)法
getSum(3, 5); // 正確寫(xiě)法,但是返回值沒(méi)有用到
System.out.println("==============");
// 對(duì)于void沒(méi)有返回值的方法,只能單獨(dú),不能打印或者賦值
// System.out.println(printSum(2, 3)); // 錯(cuò)誤寫(xiě)法!
// System.out.println(void);
// int num2 = printSum(10, 20); // 錯(cuò)誤寫(xiě)法!
// int num3 = void;
// void num4 = void;
}
// 我是一個(gè)方法,我負(fù)責(zé)兩個(gè)數(shù)字相加。
// 我有返回值int,誰(shuí)調(diào)用我,我就把計(jì)算結(jié)果告訴誰(shuí)
public static int getSum(int a, int b) {
int result = a + b;
return result;
}
// 我是一個(gè)方法,我負(fù)責(zé)兩個(gè)數(shù)字相加。
// 我沒(méi)有返回值,不會(huì)把結(jié)果告訴任何人,而是我自己進(jìn)行打印輸出。
public static void printSum(int a, int b) {
int result = a + b;
System.out.println("結(jié)果是:" + result);
}
}
5.使用方法時(shí)注意事項(xiàng)
- 方法應(yīng)該定義在類當(dāng)中,但是不能在方法當(dāng)中再定義方法。不能嵌套。
- 方法定義的前后順序無(wú)所謂。
- 方法定義之后不會(huì)執(zhí)行,如果希望執(zhí)行,一定要調(diào)用:?jiǎn)为?dú)調(diào)用、打印調(diào)用、賦值調(diào)用。
- 如果方法有返回值,那么必須寫(xiě)上“return 返回值;”,不能沒(méi)有。
- return后面的返回值數(shù)據(jù),必須和方法的返回值類型,對(duì)應(yīng)起來(lái)。
- 對(duì)于一個(gè)void沒(méi)有返回值的方法,不能寫(xiě)return后面的返回值,只能寫(xiě)return自己。
- 對(duì)于void方法當(dāng)中最后一行的return可以省略不寫(xiě)。
- 一個(gè)方法當(dāng)中可以有多個(gè)return語(yǔ)句,但是必須保證同時(shí)只有一個(gè)會(huì)被執(zhí)行到,兩個(gè)return不能連寫(xiě)。
public class Demo04MethodNotice {
public static int method1() {
return 10;
}
public static void method2() {
// return 10; // 錯(cuò)誤的寫(xiě)法!方法沒(méi)有返回值,return后面就不能寫(xiě)返回值。
return; // 沒(méi)有返回值,只是結(jié)束方法的執(zhí)行而已。
}
public static void method3() {
System.out.println("AAA");
System.out.println("BBB");
// return; // 最后一行的return可以省略不寫(xiě)。
}
public static int getMax(int a, int b) {
/*int max;
if (a > b) {
max = a;
} else {
max = b;
}
return max;*/
if (a > b) {
return a;
} else {
return b;
}
}
}
方法的重載
什么是方法的重載?
多個(gè)方法的名稱一樣,但是數(shù)據(jù)列表不一樣。
方法的重載和下列因素有關(guān):
1.和參數(shù)個(gè)數(shù)有關(guān)。
2.和多種參數(shù)的順序有關(guān)。
3.和參數(shù)類型有關(guān)。
方法的重載和下列因數(shù)無(wú)關(guān):
1.和參數(shù)的名稱無(wú)關(guān)。
2.和返回值類型無(wú)關(guān)。
public class Demo01MethodOverload {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum(10,20,30));
System.out.println(sum(10,20,30,40));
}
public static int sum(int a,int b){
return a + b;
}
//與參數(shù)的名稱無(wú)關(guān)
// public static int sum(int x , int y){
// return x + y;
// }
//與返回值類型無(wú)關(guān)
// public static double sum(double a , double b){
// return a + b;
// }
//與參數(shù)類型有關(guān)
public static int sum(double a ,double b){
return (int)(a + b);
}
//與多個(gè)不同類型參數(shù)的順序有關(guān)
public static int sum(double a,int b){
return (int)(a + b);
}
public static int sum(int a , double b){
return (int)(a + b);
}
public static int sum(int a,int b,int c){
return a + b + c;
}
public static int sum(int a,int b,int c,int d){
return a + b + c + d;
}
}
數(shù)組
什么是數(shù)組?
數(shù)組是一個(gè)容器,用來(lái)存儲(chǔ)同一類型的數(shù)據(jù)。
數(shù)組的特點(diǎn):
1.數(shù)組是一種引用類型數(shù)據(jù)。
2.數(shù)組中的數(shù)據(jù)是屬于同一種類型。
3.數(shù)組的長(zhǎng)度不可改變。
定義一個(gè)數(shù)組有兩種常見(jiàn)的方式:
1.動(dòng)態(tài)初始化數(shù)組(指定長(zhǎng)度):
數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型[數(shù)組長(zhǎng)度];
public class Demo01Array {
public static void main(String[] args) {
//創(chuàng)建一個(gè)長(zhǎng)度為10的int類型數(shù)組
int[] arr1 = new int[10];
//創(chuàng)建一個(gè)長(zhǎng)度為20的double類型數(shù)組
double[] arr2 = new double[20];
//創(chuàng)建一個(gè)長(zhǎng)度為5的String類型數(shù)組
String[] arr3 = new String[5];
}
}
2.靜態(tài)初始化數(shù)組(指定內(nèi)容):
數(shù)據(jù)類型[] 數(shù)組名稱 = new 數(shù)據(jù)類型[]{元素1,元素2,…};
public class Demo02Array {
public static void main(String[] args) {
//創(chuàng)建一個(gè)數(shù)組,是int類型數(shù)據(jù),里面裝 5,10,15
int[] arr1 = new int[]{ 5 , 10 , 15};
//創(chuàng)建一個(gè)數(shù)組,里面裝String類型數(shù)據(jù),里面裝"Hello" ,"World" ,"Java"
String[] arr2 = new String[]{"Hello" , "World" , "Java"};
}
}
靜態(tài)初始化數(shù)組的省略格式:
數(shù)據(jù)類型[] 數(shù)組名稱 = {元素1,元素2,…};
public class Demo03Array {
public static void main(String[] args) {
//省略格式創(chuàng)建一個(gè)給int數(shù)組,使用省略格式,里面是5,6,7
int[] arr1 = {5,6,7};
//靜態(tài)初始化的標(biāo)準(zhǔn)格式可以拆分為兩個(gè)步驟
int[] arr2;
arr2 = new int[]{5,6,7};
//動(dòng)態(tài)初始化也可以拆分為兩個(gè)步驟
int[] arr3;
arr3 = new int[10];
//靜態(tài)初始化一旦使用省略格式,不能再拆分為兩個(gè)步驟
// int[] arr4;
// arr4 = {5,6,7};//編譯報(bào)錯(cuò),這種格式不被允許
}
}
Java中內(nèi)存劃分為5個(gè)部分:
1.棧(Stack):存儲(chǔ)局部變量,方法的運(yùn)行在棧中。
2.堆(Heap):凡是new出來(lái)的東西,都在堆中。
3.方法區(qū):存儲(chǔ).class文件中的信息,包含方法信息。
4.本地方法棧:和操作系統(tǒng)有關(guān)。
5.寄存器:和CPU有關(guān)。
Java中數(shù)組的內(nèi)存圖:
1.一個(gè)數(shù)組的內(nèi)存圖:
public class Demo01ArrayOne {
public static void main(String[] args) {
int[] arr1 = new int[3];
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
arr1[1] = 10;
arr1[2] = 20;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
}
}
2.兩個(gè)數(shù)組的內(nèi)存圖:
public class Demo02ArrayTwo {
public static void main(String[] args) {
int[] arrA = new int[3];
System.out.println(arrA[0]);
System.out.println(arrA[1]);
System.out.println(arrA[2]);
arrA[1] = 10;
arrA[2] = 20;
System.out.println(arrA[0]);
System.out.println(arrA[1]);
System.out.println(arrA[2]);
System.out.println("==================");
int[] arrB = new int[3];
System.out.println(arrB[0]);
System.out.println(arrB[1]);
System.out.println(arrB[2]);
arrB[1] = 10;
arrB[2] = 20;
System.out.println(arrB[0]);
System.out.println(arrB[1]);
System.out.println(arrB[2]);
}
}
3.兩個(gè)引用指向同一個(gè)數(shù)組的內(nèi)存圖:
public class Demo03ArraySame {
public static void main(String[] args) {
int[] arrA = new int[3];
System.out.println(arrA[0]);//0
System.out.println(arrA[1]);//0
System.out.println(arrA[2]);//0
arrA[1] = 10;
arrA[2] = 20;
System.out.println(arrA[0]);//0
System.out.println(arrA[1]);//10
System.out.println(arrA[2]);//20
System.out.println("==============");
int[] arrB = arrA;
System.out.println(arrB[0]);//0
System.out.println(arrB[1]);//10
System.out.println(arrB[2]);//20
arrB[1] = 100;
arrB[2] = 200;
System.out.println(arrB[0]);//0
System.out.println(arrB[1]);//100
System.out.println(arrB[2]);//200
System.out.println("==============");
}
}
數(shù)組的兩種常見(jiàn)問(wèn)題:
1.數(shù)組索引越界異常:訪問(wèn)數(shù)組元素時(shí),索引編號(hào)不存在,那么將會(huì)發(fā)生數(shù)據(jù)索引越界異常。ArrayIdexOutOfBoundsException
原因:索引值不正確。
解決辦法:修改索引值。
public class Demo01ArrayIndexOutOfBoundsException {
public static void main(String[] args) {
int[] arr = {15, 25, 35};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//錯(cuò)誤寫(xiě)法,會(huì)引發(fā)數(shù)組索引越界異常
System.out.println(arr[3]);
}
}
2.空指針異常:如果沒(méi)有對(duì)數(shù)組進(jìn)行初始化,訪問(wèn)元素的時(shí)候,會(huì)產(chǎn)生空指針異常。NullPointerException
原因:沒(méi)有對(duì)數(shù)組進(jìn)行初始化,數(shù)組是null值。
解決辦法:對(duì)數(shù)組進(jìn)行初始化。
public class Demo02NullPointerException {
public static void main(String[] args) {
int[] arr = null;
//arr = new int[3];
System.out.println(arr[0]);
}
}
數(shù)組的長(zhǎng)度:
獲取數(shù)組的長(zhǎng)度通過(guò)其length屬性,即可獲得。
int length = arr.length;
注意事項(xiàng):
數(shù)組一旦創(chuàng)建,其長(zhǎng)度是不可變的。
public class Demo03ArrayLength {
public static void main(String[] args) {
//創(chuàng)建一個(gè)長(zhǎng)度為3的數(shù)組
int[] arr = new int[3];
System.out.println(arr.length);
//這里并不是數(shù)組的長(zhǎng)度由3變成5,而是又創(chuàng)建了一個(gè)
// 長(zhǎng)度為5的數(shù)組,變量arr的地址值發(fā)生了改變。
arr = new int[5];
System.out.println(arr.length);
}
}
遍歷數(shù)組:對(duì)數(shù)組中每一個(gè)元素進(jìn)行逐個(gè)處理。
public class Demo04Array {
public static void main(String[] args) {
int[] arr = {2,3,4,5,6,7,8,9,14,15,123,144,234,56,43,21,78,82,22};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
練習(xí):
1.求出數(shù)組中的最大值:
public class Demo05ArrayMax {
public static void main(String[] args) {
int[] arr = {2,3,4,5,6,7,8,9,14,15,123,144,234,56,43,21,78,82,22};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
max = arr[i];
}
}
System.out.println("最大值是:"+ max );
}
}
2.求出數(shù)組中的最小值:
public class Demo06ArrayMin {
public static void main(String[] args) {
int[] arr = {2,3,4,5,6,7,8,9,14,15,123,144,234,56,43,21,78,82,22};
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min){
min = arr[i];
}
}
System.out.println("最小值是:" + min );
}
}
3.數(shù)組的反轉(zhuǎn):
/*
* 數(shù)組的反轉(zhuǎn):
* 本來(lái)的樣子:[1,2,3,4]
* 反轉(zhuǎn)的樣子:[4,3,2,1]
* 不能使用新的數(shù)組
*
* 思路:
* 1.數(shù)組的反轉(zhuǎn)是兩個(gè)對(duì)稱位置的數(shù)據(jù)交換
* 2.需要兩個(gè)索引,min和max
* 3.需要一個(gè)臨時(shí)變量
* 4.條件判斷,當(dāng)min小于max時(shí)才交換,否則不交換
* */
public class Demo07ArrayReverse {
public static void main(String[] args) {
int[] arr = {2,3,4,5,6,7,8,9,14,15,123,144,234,56,43,21,78,82,22};
//遍歷原來(lái)的數(shù)組
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
//反轉(zhuǎn)
for (int min=0,max = arr.length-1; min < max ; min++ , max-- ){
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
//遍歷新的數(shù)組
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
數(shù)組也可以作為方法的參數(shù):
當(dāng)調(diào)用方法的時(shí)候,向小括號(hào)傳參,事實(shí)上傳遞的是數(shù)組在堆內(nèi)存中的地址值。
數(shù)組也可以作為方法的返回值:
其實(shí)返回的也是數(shù)組在堆內(nèi)存中的地址值。
public class Demo01ArrayParam {
public static void main(String[] args) {
int[] arr = {10,20,30};
myPrint(arr);
int[] result = sumAndAvg(arr);
System.out.println(result);
myPrint(result);
}
public static void myPrint(int[] arr){
//事實(shí)上傳遞的是地址值
System.out.println(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] sumAndAvg(int[] arr){
int[] arr1 = null;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
int avg = sum / arr.length;
arr1 = new int[]{sum , avg};
return arr1;
}
}