一、程序逻辑控制(顺序、选择&循环)
顺序结构就不多介绍了,就是各个语句按照先后顺序进行执行
(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