一、程序邏輯控制(順序、選擇&循環)
順序結構就不多介紹了,就是各個語句按照先后順序進行執行
(1)選擇結構
三大選擇類型:if、if-else、if-else if-else以及懸浮else的問題
基本已經在之前在C語言文章已經講過,這里不過多贅述
只需要注意兩個問題
1、Java中條件表達式只能是布爾型(Boolean,即結果是True或False)
2、表達式不能寫的太復雜,比如你把短路表達式寫進去,編譯器可能會報錯之前的C語言博客
https://blog.csdn.net/Pluchon/article/details/147186769?fromshare=blogdetail&sharetype=blogdetail&sharerId=147186769&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link
這里我們著重來講下在Java中代碼書寫風格:示例代碼↓
int num1 = 5;
if (num1 % 2 == 0) {System.out.println("是偶數");} else {System.out.println("是奇數");
}
int num2 = -1;
if (num2 > 0) {System.out.println("是正數");} else if (num2 < 0) {System.out.println("是負數");} else {System.out.println("是0");
}
在Java中,我們起始大括號“{”寫在條件判斷右邊
而結束大括號“}”寫在左邊并且寫在else之前
如果你有很多代碼需要格式化成這種格式怎么辦?
在Java的一個編譯器Idea中,我們可以選中區域按住快捷鍵Ctrl+Alt+L
這個之前也有介紹過,但是在Java中有幾個特殊之處:之前的博客文章
https://blog.csdn.net/Pluchon/article/details/147191166?fromshare=blogdetail&sharetype=blogdetail&sharerId=147191166&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link
1、Switch表達式可寫字符型,比如下面這段代碼,結果自然就是輸出正確啦
char str1 = '中';switch (str1) {case '中':System.out.println("輸出正確");break;default:System.out.println("輸出錯誤");break;}
2、表達式不能是Long、Float、Double、Boolean這四大類
(2)循環結構
這個之前也介紹過了,但是在Java中有幾個特殊之處:之前的博客文章
https://blog.csdn.net/Pluchon/article/details/147191166?fromshare=blogdetail&sharetype=blogdetail&sharerId=147191166&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link1、Java中不可用寫while(1)這種死循環,要寫也只能寫while(true)
2、Java中創建循環有快捷方式:輸入for后選擇fori,直接生成循環模板
3、之前的博客文章有個尋找素數的題,里面有個循環終止條件
4.在Java中我們開平方可直接寫成Math.sqrt()即可
我們寫一個求水仙花數的Java代碼:
public static void main6(String[] args) {//求出0~n之間的所有“水仙花數”并輸出int simple4 = 1;while(simple4<10){System.out.print(simple4+" ");simple4++;}System.out.print("\n");int num3 = 10;while(num3<=99999){int count = 0;//先統計是幾位數int temp = num3;while(temp != 0) {temp /= 10;count++;}int sum = 0;//用來計算次方和temp = num3;while(temp != 0){sum += Math.pow(temp%10,count);temp /= 10;}if(sum==num3){System.out.print(num3+" ");}num3++;}}
二、程序輸入&輸出
(1)程序的輸出
基本上跟C語言差不多,唯一有區別的就是print和println,以下是區別:
System.out.println("hello world");//這個是換行輸出 System.out.print("hello world"+" ");//這個是不換行輸出 System.out.printf("%s","hello world");//這個是格式化規范輸出,很少使用
(2)程序的輸入
對比C語言我們Java的輸入需要使用Scanner包裝類處理我們的輸入
其中必須寫的一行代碼:
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
注意:我們在輸入Scanner后回車,會自動進行導包操作
Scanner后面的sc可以取其他名字,但建議sc
其次,我們再創建變量,接收我們輸入的值
int input = sc.nextInt();
注意:你輸入的是什么類型,初始化成什么類型,目前只能讀取到一個輸入的值
這里我們講下next和nextLine的區別:next遇到空格讀取停止,而nextLine會讀取一行的內容
在你處理完輸入程序后,最后可以選擇關閉Scanner的資源
sc.close();
System.out.println("年齡");int age = sc.nextInt();System.out.println("姓名");String high = sc.nextLine();//注意看這里是nextLineSystem.out.println("年齡:"+age);System.out.println("姓名:"+high);
為什么我輸入年齡后敲完空格回車直接打印結果了呢,我姓名都沒來得及輸入啊
注意看代碼,nextLine讀取的是一行的內容,而你輸入完年齡后回車會產生一個空行
nextLine把這一行誤以為是你輸入的內容,把它讀取走了
只需要再添加一個nextLine來讀取空白行就好
System.out.println("年齡");int age = sc.nextInt();sc.nextLine();//單獨添加這一行,讓這一行把空行讀走System.out.println("姓名");String high = sc.nextLine();System.out.println("年齡:"+age);System.out.println("姓名:"+high);
循環輸入,我們就寫一個求和的循環輸入吧
int sum = 0;while(sc.hasNextInt()) {int input = sc.nextInt();//←畢竟這里是nextIntsum += input;}System.out.println(sum);
hasNextInt中int類型表示你輸入除整數以外的數循環終止
建議輸入什么就寫什么類型的hasNext
注意這段代碼有個陷阱:
你提前終止循環輸入,會導致你輸入的數沒有加到sum中去,你輸入完數后回車以下
此時再按ctrl+d才會有正確結果
三、使用方法
public static void main(String[] args) {
我們上面那一行就是main方法的基本格式
public static是修飾符,void是返回類型,main是方法名,括號里的東西是形參
你可以把方法理解成一個工廠,原材料進去成品出來
Java中的方法不需要聲明,而且你寫哪里都可以
畢竟Java是全局搜索的,而且方法不可以嵌套,不像C/C++函數一樣
其生命周期,作用域,就是在“{}”內部,進入開始,出去結束 如何調用方法呢?
我們這里創建一個求兩數之和的方法,然后就跟C語言調用函數一樣去調用方法
public static int addSimple (int num1,int num2){int ret = num1+num2;return ret;}
如果這個方法有返回類型,我們就用一個變量來接收
如果方法無返回值,則默認是為void,不需要寫變量來接收
注意你方法返回的是什么類型,你就需要用什么類型去接收
int result = addSimple(1,2);
因此我們方法的創建和調用之間形成了三匹配:
方法返回類型,返回值類型,接受方法返回值的變量的類型
你肯定寫過在C語言中通過函數交換兩個數字,用的是地址
但是在Java中,不存在地址的概念,所以Java很安全
public static void swap(int num3,int num4){//這個是方法的定義int temp = num3;num3 = num4;num4 = temp; }int num3 =1,num4 = 2;swap(1,2);System.out.println(num3+" "+num4);
我們發現并沒有交換,原理跟C語言差不多,你形參只是實參的一份臨時拷貝
也就是說形參有自己的一塊空間,你交換了形參并不等于交換了實參
在Java中只有傳值調用,而且方法調用同樣是要在棧上開辟空間
四、方法重載
接著我們將方法重載,這個跟C++很像
我們每個重構的方法可以去相同的方法名,在方法調用的時候編譯器自己選擇
重載三個條件
方法名相同,(參數列表/參數類型/參數個數)不同,并且和返回類型無關!!
我們就拿兩數之和來舉例
public static int addSimple (int num1,int num2){int ret = num1+num2;return ret;//return作為方法結束的標志}public static double addSimple (double num1,double num2){double ret = num1+num2;return ret;}int ret1 = addSimple(1,2);double ret2 =addSimple(1.5,2.5);
下滿那個方法就是addSimple方法的重載,這個重構的方法是專門求浮點型的
函數返回值支持鏈式表達式,比如return (1/2)+6
僅僅改變方法返回值類型是不會構成方法重載的
?五、方法遞歸
在C語言中函數有遞歸,那在Java中方法自然也有遞歸,基本上和C語言類似
這里列出特殊之處:如果你無線遞歸下去,沒有終止條件,會導致棧溢出,報錯如下
給出一個例題練習:遞歸一個數字,并把各個位數數字求和,比如2255,各個位數之和是14
public static void print(int num){if(num<10){System.out.print(num+" ");}else {print(num / 10);//遞推System.out.print(num % 10+" ");//回歸的時候打印}}int ret5 = addPlus(2255); System.out.println(ret5);
為什么不寫else會導致棧溢出?
這是因為在if中不存在return語句,return語句作用就是終止后面代碼執行
即使你的num小于了10,上面執行完了,下面的else部分還是會執行
之前在C語言已經寫過很多遞歸練習,這里給出之前寫的博客鏈接,寫法基本上一致
C語言中遞歸介紹和練習
https://blog.csdn.net/Pluchon/article/details/147530549?fromshare=blogdetail&sharetype=blogdetail&sharerId=147530549&sharerefer=PC&sharesource=Pluchon&sharefrom=from_linkC語言中遞歸經典練習
https://blog.csdn.net/Pluchon/article/details/147514375?fromshare=blogdetail&sharetype=blogdetail&sharerId=147514375&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link
這里給出Java遞歸的漢諾塔問題的代碼
public static void hanNuoTa (int num,char pos1,char pos2,char pos3){if(num==1) {//遞歸終止條件System.out.print(pos1+"→"+pos3+" ");}else {//一定要寫else,因為遞歸式子中無return,會導致無限遞歸hanNuoTa(num - 1, pos1, pos3, pos2);System.out.print(pos1 + "→" + pos2+" ");hanNuoTa(num - 1, pos2, pos1, pos3);}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int input = sc.nextInt();hanNuoTa(input,'A','B','C');}
作者基礎不是很強,文章撰寫難免會有疏漏之處,歡迎指出,我們友好交流
Git碼云倉庫鏈接:
本文章使用的代碼https://gitee.com/pluchon/java-career/tree/master/TestProject20250515/src
END