Java全面详细讲解逻辑控制的使用
作者:影子,你陪着我累吗? 发布时间:2021-10-16 12:48:42
一,块作用域
首先在深入学习控制结构之前,需要先了解块(block)的概念。
块:即复合语句,是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。
public class TestDemo220425 {
public static void main(String[] args) {
int n = 10;
{
int k = 20;
int n = 20;
}
}
}
在这段代码中,我们主函数里面的那个括号括起来的部分就是块。一个块可以嵌套在另一个块里面,但是注意,在Java里面,不能在嵌套的块里面声明同名的变量,比如上面代码的内部块里面 int n = 20的做法就是错误的。这里要区分C/C++里面有全局变量遇到同名局部变量的时候会优先使用局部变量,屏蔽全局变量,这在Java里面是不允许这样做的(Java无全局变量的概念,这里只是类比)。
二,顺序结构
顺序结构比较简单,按照代码书写的顺序一行一行执行。
图示:
三,分支结构
图示:
注意:if /else if 之间是一个并列的关系,不像是if else是一个非此即彼的关系,这种叫做多分支的结构。
有关分支结构的几个注意点:
1,if括号里面的表达式只能是布尔表达式,没有什么非0为真,0表示假。
2,Java里面的代码风格我们推荐行尾风格。
3,悬空else问题,也就是说if/else语句最好一定要把括号加上,这样代码可读性更好,如果不加,当有多个if/else语句时,else一定是与最近的else进行匹配
public class TeseDemo220424 {
public static void main(String[] args) {
int x = 10;
int y = 10;
if (x == 10)
if (y == 10)
System.out.println("aaa");
else //这个else其实匹配的是if(y == 10)
System.out.println("bbb");
}
}
switch语句问题(重点)
public class TeseDemo220424 {
public static void main(String[] args) {
int a = 3;
switch(a){
default:
System.out.println("输入错误!");
break;
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
}
}
}
注意:
1,无论default的位置在哪里,只要没有匹配到任何一个case,就会直接走default。
2,每一个case语句以及default语句后面的break语句都不能省略,不然就会穿透执行,除非是在特定的情况下,不然break都不能掉。
3,switch结构里面的关键字只有case,break,continue是用在循环里面的,这里是分支结构,不要混淆。
4,switch括号里面的数据的类型只能是byte, short, int, char,String, enum类型,然后case后面的常量与switch匹配就行。(注意不能是long,因为整形都会往int转,但是long转int会有精度损失)。
5,case后面的常量值不能够重复,每一个case就代表一种不同的情况。
6,switch的括号里面可以放表达式,但是不能像if语句一样,可以放一些较为复杂的表达式。
7,switch语句可以嵌套,但是不好看。
四,循环
三大循环:while循环,for循环,do while循环(循环具体的基本定义就不做介绍了,这里只是点一些要注意的点)
4.1,易错点
1,循环的几个部分,循环变量的定义,条件判断,循环体,循环变量的迭代。一定要注意循环变量的迭代,如果说一个循环变量没有迭代直至向着跳出循环的方向进行的话,那么就可能造成死循环了。
2,不要在循环内部对循环变量做手脚,即使你需要使用你的循环变量,用一个临时的变量来接收它的值,然后再去使用。
3,轻易不要将浮点数作为循环变量。
public class TestDemo220425 {
public static void main(String[] args) {
for(double x = 0;x != 10;x += 0.1){
System.out.println("haha");
}
}
}
不出意外的,这段代码死循环了,也就是我说的将浮点数作为循环变量。因为0.1在存储的时候,小数部分是无法用二进制准确表示的,所以我们每次加的都是一个近似值,那么这里可能刚好加了之后可能刚好跳过了10,所以循环就一直进行了下去。
4.2,break语句
public class TeseDemo220424 {
public static void main(String[] args) {
int i = 1;
while(i <= 10){
if(i == 2){
break;
}
System.out.println("hehe");
i++;
}
}
}
程序运行截图:
break语句的作用是跳出它所在的循环,比如上面当i == 2的时候,就会跳出while循环,所以只会输出一个hehe。
break的扩展用法:
在Java中,是没有goto语句的,但是因为设计者认为goto语句思想还是没有问题的在某些特定的条件下,确实可以起到很好的跳出循环的效果,所以在Java里面就发明了**带标签的break语句,作用是可以达到break到标签所指定的循环的外部。 (标签只要是合法的标识符即可)**
示例:
public class TestDemo220425 {
public static void main(String[] args) {
label1:
while(true){
for(int i = 0;i < 10;i++){
if(i == 3){
break label1;
}
System.out.println(i);
}
}
System.out.println("已跳出循环!");
}
}
程序运行截图:
可以看到,到我们利用标签后,可以指定跳出到哪里。如果这里只是用break,不用标签的话,那么break就只会跳出里层的for循环,外面的while还是一个死循环,用了标签之后,当i== 3,就可以直接跳出到while循环的外部。
4.3,continue语句
public class TeseDemo220424 {
public static void main(String[] args) {
int i = 1;
while(i <= 10){
if(i == 2){
continue;
}
System.out.println("hehe");
i++;
}
}
}
程序运行截图:
continue语句的作用是结束本轮循环而开始下一次的循环,如上题,当i == 2,所以就会直接跳过后面的语句,也就是i++不会执行了,导致i一直等于2,所以陷入了死循环。当然如果你这里用for循环就不会这样了,因为i++的执行顺序在前面,continue影响不到
continue扩展用法:
同样的,在continue里面,也是可以使用标签的,可以指定跳到与标签匹配的循环的首部。
示例:
public class TestDemo220425 {
public static void main(String[] args) {
label1:
for(int i = 0;i < 10;i++){
if(i == 3){
continue label1;
}
System.out.println(i);
}
}
程序运行截图:
五,输入输出
5.1,输出到控制台
利用%结合上面的转换符就可以进行格式化的输出,当然在进行格式化输出的时候,也可以运用一些标志,比如输出的时候带前缀,带正负号等等…
5.2,从键盘输入
public class TeseDemo220424 {
public static void main(String[] args) {
Scanner myscanner = new Scanner(System.in);
System.out.println("请输入年龄");
int num = myscanner.nextInt();
System.out.println(num);
System.out.println("请输入名字");
String str = myscanner.nextLine();//读入一行
System.out.println(str);
System.out.println("请输入专业");
String str1 = myscanner.next();
System.out.println(str1);//读入一个字符串,遇到空格停止
}
}
这里就是要注意你的输入与你接收的方法要对应,另外就是当你用了nextLine()来接收一行的时候,要注意它前面有不有用输入的方法,因为你的换行会被当成一行读入到nextLine()里面,这里就类似于C语言里面吃掉缓冲区里面的回车是一个道理。
程序运行截图:
扩展,在用键盘进行输入的时候,我们是能够看到我们自己的输入的,但是在某些情况下,比如输入密码,我们一般是不想让人看到的,所以这里可以运用到Console类。(这里只做简要介绍)
Console类:访问与当前Java虚拟机关联的基于字符的控制台设备(如果有的话)的方法,也即使从控制台接收输入的方法。
使用示例:
import java.io.Console;
public class TestDemo220425 {
public static void main(String[] args) {
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password:");
}
}
在IDEA下的运行截图:
❌???怎么直接报空指针异常了,寻思着这里也没用到指针吧,感到十分的不解…🤔🤔
后来,度娘告诉我是这样的:在使用IDEA等集成开发环境中,使用Console将全为null,表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。以至于我们只能去控制台下或者linux环境下去运行程序,如下图在控制台下运行:
可以看到在控制台下运行正常,并且我们输入的密码是看不到的(这里真的输入了的哦,只是看不到,中国人不骗中国人的!😊)
5.3,循环输入
public class TeseDemo220424 {
public static void main(String[] args) {
Scanner myscanner1 = new Scanner(System.in);
while(myscanner1.hasNextInt()){
int age = myscanner1.nextInt();
}
}
}
hasNextInt():如果此扫描器输入中的下一个标记可以使用nextInt()
方法将其解释为默认基数中的int值,则返回true。也即是说只有你下一个输入的是int类型的值才能够进入循环。
程序运行截图:
循环输入的时候可以ctrl + D 进行正常退出
六,猜数字游戏
这里主要是介绍Java里面的生成随机数的方法
所在包:Java.util.random
import java.util.Random;
public class TeseDemo220424 {
public static void main(String[] args) {
// 生成随机数
Random random = new Random();
int rannum = random.nextInt(100);//生成[0,100) 的随机数 其他范围可以通过在后面加上数来进行范围改变,默认左边都是从0开始
}
}
对于int rannum = random.nextInt();
如果你后面nextInt()中不给值,那么它产生的就是所有有效的整数,包括正数,负数,0
注意:Random random = new Random(2022);
这里在定义随机数对象的时候是可以传参的,因为生成随机数是以时间戳为参考的,所以当你传入一个数后,他就只会以这个数为标准进行时间戳的计算,进而产生的随机数每次都是一样的。
其他方法:
其他方法主要就是Math.random(),这个产生的是0~1之间的小数,左闭右开。当然这个是没有上面那种产生同一个随机数的用法的。
来源:https://blog.csdn.net/qq_61688804/article/details/124411677
猜你喜欢
- 首先:我们要建一个web项目接着: 我们先来导入struts的xml文件第一步:右击你的项目名,鼠标到MyEclipse会看到一个add s
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.贪心算法贪心算法 (Greedy Algorithm)
- Spring介绍:spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而, Spring的用途不仅限于服务
- 上篇博客我们了解了请求参数的获取,那么获取到请求参数之后,需要对参数进行出来,然后进行数据响应。那么这篇博客我们就来了解 Controlle
- 之前看过一句话,说的特别好。有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平。是的,大家都实现一个功能,不同的人有
- Spring propagation7种事务配置1、简述在声明式的事务处理中,要配置一个切面,其中就用到了propagation,表示打算对
- 本文实例为大家分享了Unity shader实现自由放大缩小效果的具体代码,供大家参考,具体内容如下代码:以下实现的shader代码:Sha
- 我就废话不多说了,大家还是直接看代码吧~/// <summary> /// 字符串转Unicode //
- 本文实例讲述了Java基于命令模式实现邮局发信功能。分享给大家供大家参考,具体如下:一. 模式定义命令模式,将来自客户端的请求封建为一个对象
- 本Demo使用三个类一个Test类一个自定义的Stack类一个自定义的Queue类可以实现的功能:1.对于一个写在文本文件中的迷宫,能够将其
- 这一篇博客我们来使用 UGUI 实现图片的拖拽功能。说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还
- 这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文实例讲述了基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览的方法。分享给大家供大家参考。具体分析如下:一
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- java static块和构造函数的实例详解构造函数不写时,若该类继续了某个类则会默认集成父类的构造函数。 构造函数在实例化类时执行内部,O
- 这里不准备讨论REST的细节内容,但是总体上,REST是让客户端与服务器段的交互通过发送和接收展示资源的方式来进行,在这里有必要说明:Fie
- Spring AOP底层原理代理模式一、什么是 AOPAOP 就是面向切面编程,是 OOP(面向对象编程)的延续。利用 AOP 可以对业务逻
- 文件目录结构文件目录结构很重要,特别注意的是rule文件要放在主启动类上一级位置,才能够扫描。写pom<dependencies>
- 1、不必要的自动装箱。自动装箱是将基础数据类型转换为相应的复杂类型,在HashMap的追加删除调查中充满了自动装箱问题,因此尽量避免Hash
- 本文实例为大家分享了Unity实现俄罗斯方块的具体代码,供大家参考,具体内容如下一、使用SpriteRenderer作为小方块图片,创建7种