ホームページ >Java >&#&チュートリアル >Javaロジック制御の使い方
まず、制御構造を深く学ぶ前に、ブロック(block)の概念を理解する必要があります。
ブロック: 複合ステートメントは、中括弧のペアで囲まれた複数の単純な Java ステートメントを指します。ブロックは変数のスコープを決定します。ブロックは別のブロック内にネストできます。
public class TestDemo220425 { public static void main(String[] args) { int n = 10; { int k = 20; int n = 20; } } }
このコードでは、main関数の括弧で囲まれた部分がブロックです。ブロックは別のブロック内にネストできますが、Java では、ネストされたブロック内で同じ名前の変数を宣言できないことに注意してください。たとえば、上記のコードの内側のブロックの int n = 20 は間違っています。ここで、C/C でグローバル変数を区別する必要があります。同じ名前のローカル変数が見つかった場合、ローカル変数が最初に使用され、グローバル変数はシールドされます。これは Java では許可されていません (Java にはグローバル変数の概念がありません)。これは単なる例えです)。
シーケンシャル構造は比較的単純で、コードが書かれた順序で 1 行ずつ実行されます。
図:
図:
##注: /else if が並列関係の場合、else が二者択一の関係とは異なり、これはマルチブランチ構造と呼ばれます。
分岐構造に関する注意点:
1. if 括弧内の式はブール式のみにすることができます。0 以外は true であり、0 は false を意味します。
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"); } }
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; } } }
Note:
1 と一致する必要があります。デフォルトの位置がどこであっても、そこにある限りは一致しません。いずれの場合も、デフォルトが直接使用されます。
2. 各 case 文と、default 文以降の Break 文は省略できません、そうでない場合は実行されますので、特別な場合を除き、break は省略できません。
3. switch 構造のキーワードは、ループ内で使用される case、break、および continue だけですが、これは分岐構造なので、混同しないようにしてください。
4. スイッチの括弧内のデータ型は、byte、short、int、char、String、enum 型、および大文字と小文字がスイッチに一致した後の定数のみにすることができます。 (整数は int に変換されるため、long にすることはできませんが、long を int に変換すると精度が失われることに注意してください)。
5. ケースの後の定数値は繰り返すことができません。各ケースは異なる状況を表します。
6. switch の括弧内に式を入れることはできますが、if ステートメントのようにはできず、より複雑な式を入れることもできます。
7、switch ステートメントはネストできますが、見た目は良くありません。
3 つの主要なループ: while ループ、for ループ、do while ループ (ループの具体的な基本定義は紹介しません。ここでは注意すべき点をいくつか紹介します) )
public class TestDemo220425 { public static void main(String[] args) { for(double x = 0;x != 10;x += 0.1){ System.out.println("haha"); } } }予想どおり、このコードは無限にループします。これは、浮動小数点数をループ変数として使用することを意味します。 0.1を格納すると小数部が2進数で正確に表現できないため、加算するたびに近似値となり、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++; } } }
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循环的外部。
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); } }
程序运行截图:
利用%结合上面的转换符就可以进行格式化的输出,当然在进行格式化输出的时候,也可以运用一些标志,比如输出的时候带前缀,带正负号等等…
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环境下去运行程序,如下图在控制台下运行:
可以看到在控制台下运行正常,并且我们输入的密码是看不到的(这里真的输入了的哦,只是看不到,中国人不骗中国人的!????)
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之间的小数,左闭右开。当然这个是没有上面那种产生同一个随机数的用法的。
以上がJavaロジック制御の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。