资讯动态

重拾Java

发布时间:2026/10/27 18:51:33 来源:尧图企业网站定制
一、包机制为类组织命名空间为了更好地组织类Java 提供了包机制用于区别类名的命名空间。当项目规模变大、类数量增多时不同开发者或不同模块中很可能出现同名类包机制正是解决这一问题的核心手段。包语句的语法格式为package pkg1[.pkg2[.pkg3...]];包语句必须写在 Java 源文件的第一行注释除外一个源文件中最多只能有一条 package 语句。1.1 包名的命名规范一般利用公司域名倒置作为包名这样可以最大程度保证包名的全局唯一性。例如公司域名为example.com则包名通常写作com.example若再细分模块可以写成com.example.project.module。常见的包名约定如下包名全部使用小写字母避免与类名混淆。多级包之间用英文句点.分隔每一级对应文件系统中的一个目录。包名应具有业务含义如com.example.service、com.example.dao。1.2 使用 import 导入包成员为了能够使用某一个包的成员我们需要在 Java 程序中明确导入该包。使用import语句可完成此功能语法格式为import package1[.package2...].(classname|*);其中classname表示导入具体的类*表示导入该包下所有的类。例如import java.util.Scanner; import java.util.*;需要注意的是import java.util.*;只会导入java.util包下的类并不会导入其子包中的类。另外java.lang包下的类如String、System会被自动导入无需显式声明。二、Scanner 对象获取键盘输入Scanner是java.util包中提供的工具类用于读取用户的键盘输入。使用前需要先导入并创建对象import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // 使用完毕后关闭资源 scanner.close(); } }Scanner 提供了两种常用的字符串读取方法next()和nextLine()二者在结束条件和空白处理上有明显区别。2.1 next() 方法一定要读取到有效字符后才可以结束输入。对输入有效字符之前遇到的空白next()方法会自动将其去掉。只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。next()不能得到带有空格的字符串。示例Scanner scanner new Scanner(System.in); System.out.print(请输入内容); String str scanner.next(); System.out.println(输入的内容为 str);若输入hello world程序只会输出hello后面的world会被留在缓冲区中。2.2 nextLine() 方法以 Enter 为结束符也就是说nextLine()方法返回的是输入回车之前的所有字符。可以获得空白。示例Scanner scanner new Scanner(System.in); System.out.print(请输入内容); String str scanner.nextLine(); System.out.println(输入的内容为 str);若输入hello world程序会完整输出hello world。2.3 两种方法的对比对比项next()nextLine()结束符空白字符空格、Tab、回车回车Enter是否保留空格不能获取带空格的字符串可以获取空白前导空白自动去除原样保留适用场景读取单个单词、标识符读取整行文本2.4 常见坑next() 与 nextLine() 混用当先调用next()再调用nextLine()时next()会把回车符留在缓冲区导致随后的nextLine()直接读到空字符串。解决办法是在两者之间额外调用一次nextLine()消费掉残留的换行符Scanner scanner new Scanner(System.in); String name scanner.next(); scanner.nextLine(); // 消费残留的换行符 String address scanner.nextLine(); System.out.println(name 住在 address);三、Scanner进阶在掌握了next()和nextLine()的基本用法后可以进一步利用 Scanner 的类型判断方法实现更健壮的输入处理。下面通过两个示例演示hasNextInt()、hasNextFloat()以及循环读取的常见写法。3.1 判断输入类型使用hasNextInt()和hasNextFloat()可以先判断用户输入是否符合目标类型避免类型不匹配时抛出异常public static void main(String[] args) { Scanner scanner new Scanner(System.in); int i 0; float f 0.0f; System.out.println(请输入整数); if (scanner.hasNextInt()) { i scanner.nextInt(); System.out.println(整数数据 i); } else { System.out.println(输入非整!); } System.out.println(请输入小数); if (scanner.hasNextFloat()) { f scanner.nextFloat(); System.out.println(小数数据 f); } else { System.out.println(输入非小数!); } scanner.close(); }运行效果若第一次输入10输出「整数数据10」若输入abc则输出「输入非整!」。同理小数输入3.14会输出「小数数据3.14」输入非数字则提示「输入非小数!」。3.2 循环读取并求和结合while循环和hasNextDouble()可以持续读取用户输入的数据直到输入非数字为止并实时统计个数、总和与平均值public static void main(String[] args) { Scanner scanner new Scanner(System.in); double sum 0; int m 0; // 通过循环来判断 while (scanner.hasNextDouble()) { double x scanner.nextDouble(); m m 1; sum sum x; System.out.println(你输入了第 m 个数据当前结果为 sum); } System.out.println(m 个数的和为 sum); System.out.println(m 个数的平均数为 (sum / m)); }运行效果依次输入10、20、30每输入一个数都会打印当前累加结果最后输入一个非数字如end结束循环程序输出「3个数的和为60.0」和「3个数的平均数为20.0」。提示循环结束后若m为 0计算平均值时会出现除零问题实际开发中建议先判断m 0再计算。四、顺序结构顺序结构是程序中最基本的结构代码按照从上到下的顺序依次执行中间没有跳转和判断。绝大多数 Java 程序的主体都是顺序结构。public class SequenceDemo { public static void main(String[] args) { int a 10; int b 20; int sum a b; System.out.println(a a); System.out.println(b b); System.out.println(sum sum); } }上面的代码严格按照书写顺序执行先定义变量再计算最后输出。顺序结构是选择结构和循环结构的基础任何复杂的程序都可以拆解为顺序执行的语句块。五、选择结构选择结构用于根据条件决定执行哪一段代码Java 提供了if语句和switch语句两种形式。5.1 if 语句if语句有三种常见写法单分支、双分支和多分支。int score 85; // 单分支 if (score 60) { System.out.println(及格); } // 双分支 if (score 60) { System.out.println(及格); } else { System.out.println(不及格); } // 多分支 if (score 90) { System.out.println(优秀); } else if (score 80) { System.out.println(良好); } else if (score 60) { System.out.println(及格); } else { System.out.println(不及格); }在实际业务中判断条件往往不止一层。例如先判断是否及格再在及格的前提下继续区分优秀、良好和一般这时就需要在if语句内部再嵌套一层if形成嵌套的if结构int score 85; if (score 60) { // 外层条件成立已经及格再细分等级 if (score 90) { System.out.println(优秀); } else if (score 80) { System.out.println(良好); } else { System.out.println(及格); } } else { System.out.println(不及格); }嵌套if的执行逻辑是先判断外层条件只有外层条件为true时才会进入内层继续判断外层条件为false时内层if根本不会执行。因此嵌套结构天然表达了「先满足大前提再细分小条件」的层级关系。使用嵌套if时有两点需要注意每一层if都建议使用大括号包裹代码块即使只有一行语句这样可以避免「悬空 else」带来的歧义。嵌套层数不宜过深一般控制在两到三层以内层数过多时可考虑改用else if多分支或抽取成独立方法以提升可读性。5.2 switch 语句当判断条件是有限个离散值时使用switch语句比多重if更清晰。int day 3; switch (day) { case 1: System.out.println(星期一); break; case 2: System.out.println(星期二); break; case 3: System.out.println(星期三); break; default: System.out.println(其他); break; }需要注意switch支持的类型包括byte、short、int、char、String和枚举每个case后通常要写break否则会发生穿透继续执行下一个分支。六、循环结构循环结构用于重复执行某段代码Java 提供了while、do-while和for三种循环语句。6.1 while 循环先判断条件条件为真时执行循环体可能一次都不执行。int i 1; while (i 5) { System.out.println(i i); i; }6.2 do-while 循环先执行一次循环体再判断条件因此循环体至少执行一次。int i 1; do { System.out.println(i i); i; } while (i 5);6.3 for 循环适合循环次数已知的场景语法结构最紧凑。for (int i 1; i 5; i) { System.out.println(i i); }6.4 三种循环的对比循环类型特点适用场景while先判断后执行可能一次都不执行循环次数不确定do-while先执行后判断至少执行一次需要先执行一次的场景for初始化、条件、更新集中书写循环次数确定七、break 与 continuebreak和continue是控制循环流程的两个关键字二者作用不同。7.1 breakbreak用于立即跳出当前所在的循环或switch语句不再执行循环中剩余的代码。for (int i 1; i 10; i) { if (i 5) { break; } System.out.println(i i); } // 输出 1 到 47.2 continuecontinue用于跳过本次循环中剩余的语句直接进入下一次循环。for (int i 1; i 10; i) { if (i % 2 0) { continue; } System.out.println(i i); } // 只输出奇数 1、3、5、7、97.3 两者的区别关键字作用执行后break终止整个循环跳出循环执行循环之后的代码continue跳过本次循环进入下一次循环判断在嵌套循环中break和continue默认只作用于最近的一层循环。如果需要跳出外层循环可以使用带标签的breakouter: for (int i 1; i 3; i) { for (int j 1; j 3; j) { if (i * j 4) { break outer; } System.out.println(i * j (i * j)); } }八、for 循环练习掌握了for循环的基本语法后下面通过五个循序渐进的练习来巩固循环的常见用法从简单的累加统计到格式化输出、嵌套循环、数组遍历再到与continue的配合使用。8.1 练习一同时统计奇数和与偶数和第一个练习用一次循环同时统计奇数和与偶数和核心思路是用i % 2 ! 0判断奇偶再分别累加到两个变量中。package com.fan.struct; public class ForDemo01 { public static void main(String[] args) { // 计算 0 到 100 之间的奇数和与偶数和 int oddsum 0; int evensum 0; for (int i 0; i 100; i) { if (i % 2 ! 0) { oddsum i; } else { evensum i; } } System.out.println(奇数和 oddsum); System.out.println(偶数和 evensum); } }要点说明循环条件i 100表示只统计 0 到 99如果需要包含 100应改为i 100。累加变量必须在循环外初始化否则每次循环都会被重置为 0。用取余运算判断奇偶是这类题目的通用写法。8.2 练习二筛选并格式化输出第二个练习在筛选的基础上增加了格式化输出每输出 5 个数换一行让结果更整齐。package com.fan.struct; public class ForDemo02 { public static void main(String[] args) { for (int i 0; i 1000; i) { if (i % 5 0) { System.out.print(i \t); } if (i % (5 * 3) 0) { System.out.println(); } } } }要点说明i % 5 0用于筛选 5 的倍数\t是制表符用来对齐输出。i % (5 * 3) 0表示每 15 个数换一行因为 15 是 5 和 3 的最小公倍数这样每行正好 3 个 5 的倍数。如果希望每行固定输出 5 个数可以改用计数器变量控制换行逻辑会更直观。8.3 练习三嵌套循环打印九九乘法表第三个练习是经典的嵌套循环案例。外层循环控制行数内层循环控制每行输出的列数内层循环的上限跟随外层变量变化从而形成三角形结构。package com.fan.struct; public class ForDemo03 { public static void main(String[] args) { for (int j 1; j 9; j) { for (int i 1; i j; i) { System.out.print(i * j (i * j) \t); } System.out.println(); } } }要点说明外层变量j从 1 递增到 9内层变量i从 1 递增到j因此每行的列数逐行增加形成正三角结构。内层循环结束后调用System.out.println()换行这是嵌套循环输出的固定套路。把外层循环改为for (int j 9; j 1; j--)就能得到倒三角乘法表。8.4 练习四数组遍历的两种方式第四个练习对比了两种数组遍历方式下标遍历和增强for循环for-each。package com.fan.struct; public class ForDemo04 { public static void main(String[] args) { int[] numbers {10, 20, 30, 40, 50}; // 定义一个数组 for (int i 0; i 5; i) { System.out.println(numbers[i]); } System.out.println(); for (int x : numbers) { System.out.println(x); } } }要点说明下标遍历适合需要索引的场景例如修改数组元素或逆序输出。增强for循环写法更简洁适合只读取元素的场景但它拿不到下标。下标遍历时建议用numbers.length代替硬编码的 5避免数组长度变化后出现越界异常。8.5 练习五while 循环配合 continue第五个练习演示while循环配合continue的用法从 1 输出到 100但遇到 10 的倍数时不输出数字而是先换行再跳过本次循环的剩余语句。package com.fan.struct; public class ContinueDemo { public static void main(String[] args) { int i 0; while (i 100) { i; if (i % 10 0) { System.out.println(); continue; } System.out.println(i); } } }要点说明i必须写在continue之前否则执行continue后循环变量不再自增会陷入死循环。continue的作用是跳过本次循环中它后面的语句直接进入下一次循环条件判断因此 10 的倍数不会被打印出来。遇到 10 的倍数时先调用System.out.println()输出一个空行起到分组分隔的效果。如果把continue换成break循环会在第一个 10 的倍数处直接结束输出结果完全不同。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑