Java 基础入门(五):控制台输入输出与方法详解
文章目录一、控制台输出1.1 常见的输出方法1.1.1 println()输出并换行1.1.2 print()输出但不换行1.1.3 printf()格式化输出二、控制台输入2.1 Scanner 的基本使用2.2 输入字符串2.2.1 next()读取一个单词2.2.2 nextLine()读取一整行2.2.3 next() 与 nextLine() 的区别2.3 输入整数2.4 输入浮点数2.5 Scanner 常用输入方法总结2.6 如何处理多组输入三、方法的概念与使用3.1 方法的概念3.2 方法的定义3.3 方法的定义与调用3.4 方法的返回值3.4.1 有返回值的方法3.4.2 没有返回值的方法3.5 方法的参数3.6 形参和实参3.7 Java 的参数传递值传递3.7.1 为什么 swap() 不能交换两个 int 变量3.7.2 结合方法调用栈理解四、方法重载4.1 方法重载的概念4.2 方法重载示例4.3 重载方法如何匹配一、控制台输出在 Java 中控制台输出是指将程序运行过程中产生的信息显示在控制台上。前面的学习中我们已经多次使用System.out.println();实际上Java 还提供了其他常见的输出方式。1.1 常见的输出方法Java 中常见的控制台输出方法包括方法作用System.out.print()输出内容不自动换行System.out.println()输出内容结束后换行System.out.printf()按照指定格式输出内容1.1.1 println()输出并换行publicclassOutputDemo{publicstaticvoidmain(String[]args){System.out.println(Hello);System.out.println(Java);}}运行结果Hello Javaprintln()在输出指定内容后会自动换行。因此下一次输出会从新的一行开始。1.1.2 print()输出但不换行publicclassOutputDemo{publicstaticvoidmain(String[]args){System.out.print(Hello );System.out.print(Java);}}运行结果Hello Javaprint()不会自动换行因此后续内容会继续输出在同一行。如果希望主动换行可以使用转义字符\n。例如System.out.print(Hello\nJava);运行结果Hello Java1.1.3 printf()格式化输出printf()允许在字符串中使用格式说明符按照指定格式输出数据。例如publicclassOutputDemo{publicstaticvoidmain(String[]args){StringnameTom;intage20;doublescore95.678;System.out.printf(姓名%s年龄%d成绩%.2f%n,name,age,score);}}运行结果姓名Tom年龄20成绩95.68常见的格式说明符格式说明符作用示例%d输出十进制整数20%f输出浮点数3.140000%.2f保留两位小数3.14%s输出字符串形式的内容Hello%c输出字符A%b输出布尔形式的内容true二、控制台输入前面编写的程序中大部分数据都是直接写在代码中的。例如intage20;但实际开发中数据往往需要由用户输入。为了在 Java 程序中读取控制台输入可以使用Scanner类。2.1 Scanner 的基本使用Scanner位于java.util包中因此使用之前需要导入importjava.util.Scanner;随后创建Scanner对象ScannerscannernewScanner(System.in);其中ScannerJava 提供的输入扫描类。scanner创建的对象名称。new Scanner(System.in)创建一个从标准输入读取数据的 Scanner 对象。System.inJava 的标准输入流通常对应控制台输入。现在还没有正式学习类和对象因此暂时只需要掌握这段代码的基本用法即可。2.2 输入字符串使用Scanner输入字符串时常见的两个方法是next()nextLine()虽然它们都能读取字符串但读取规则不同。2.2.1 next()读取一个单词next()会读取下一个以空白字符分隔的输入内容。这里的空白字符通常包括空格制表符换行符示例importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);System.out.print(请输入姓名);Stringnamescanner.next();System.out.println(姓名name);}}假设输入Zhang San程序输出姓名Zhang这是因为next()遇到空格后当前内容读取结束。2.2.2 nextLine()读取一整行如果希望读取包含空格的完整内容可以使用nextLine()。importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);System.out.print(请输入姓名);Stringnamescanner.nextLine();System.out.println(姓名name);}}假设输入Zhang San程序输出姓名Zhang SannextLine()会读取当前行剩余的内容直到遇到行结束位置并且不会将换行符包含在返回的字符串中。2.2.3 next() 与 nextLine() 的区别比较项next()nextLine()读取单位一个以空白分隔的内容当前行剩余内容能否读取带空格的完整句子不适合可以遇到空格当前内容结束继续读取遇到换行作为分隔符结束当前行注意混合使用 nextInt() 与 nextLine() 时需要特别小心。例如ScannerscannernewScanner(System.in);System.out.print(请输入年龄);intagescanner.nextInt();System.out.print(请输入姓名);Stringnamescanner.nextLine();假设用户输入年龄20后按下回车。此时nextInt()只读取整数当前行末尾的换行仍然留在输入中。紧接着执行nextLine()它会读取当前行剩余的内容因此可能直接得到一个空字符串。如果希望接下来输入新的一行可以先读取掉当前行的剩余内容intagescanner.nextInt();scanner.nextLine();// 消耗当前行剩余内容Stringnamescanner.nextLine();这是Scanner使用过程中非常常见的易错点。2.3 输入整数如果希望用户输入整数可以使用nextInt()例如importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);System.out.print(请输入年龄);intagescanner.nextInt();System.out.println(年龄age);}}示例运行请输入年龄20 年龄20需要注意nextInt()要求下一个输入内容能够按照相应的整数格式解析。如果输入的是无法解析为整数的内容例如abc就可能抛出InputMismatchException。2.4 输入浮点数如果希望读取小数可以根据需要使用nextFloat()nextDouble()例如importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);System.out.print(请输入体重);doubleweightscanner.nextDouble();System.out.println(体重weight);}}示例运行请输入体重65.5 体重65.5其中nextFloat()读取float类型的数据。nextDouble()读取double类型的数据。2.5 Scanner 常用输入方法总结方法作用next()读取下一个字符串内容nextLine()读取当前行剩余内容nextInt()读取 int 整数nextFloat()读取 float 浮点数nextDouble()读取 double 浮点数这些方法的输入格式应当与预期的数据类型一致否则可能出现输入异常。2.6 如何处理多组输入在算法练习中经常需要连续读取多个整数但题目不一定提前告知输入数据的数量。这时可以结合while循环和Scanner的hasNextInt()方法实现。例如importjava.util.Scanner;publicclassInputDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);while(scanner.hasNextInt()){intnumscanner.nextInt();System.out.println(num);}}}运行过程程序启动后等待用户输入整数。10 // 用户输入 10按下回车 10 // 程序输出 10 20 // 用户输入 20按下回车 20 // 程序输出 20 30 // 用户输入 30按下回车 30 // 程序输出 30注意hasNextInt()用于判断下一个输入内容能否解析为int本身不会消耗该整数。nextInt()用于实际读取整数。输入三个整数后程序不会自动结束而是继续等待后续输入。如果需要主动结束输入可以向控制台发送文件结束标记EOF。Windows 命令行通常使用Ctrl Z后按回车Linux、macOS 终端通常使用Ctrl D。IDEA 中的操作可能因控制台配置而不同。此外也可以一次性输入10 20 30因为nextInt()会按照空白字符分隔读取每个整数。但在学习阶段逐个输入更有助于理解循环读取的执行过程。三、方法的概念与使用在前面的学习中我们已经能够使用流程控制解决一些问题。例如判断某一年是否为闰年intyear2024;if((year%40year%100!0)||year%4000){System.out.println(是闰年);}else{System.out.println(不是闰年);}如果程序中有多个位置都需要判断闰年难道每次都需要重新编写这段代码吗显然没有必要。这时就可以使用方法Method将具有特定功能的代码组织起来方便重复调用。3.1 方法的概念方法是 Java 中用于完成特定功能的一段代码。通过方法我们可以将复杂的程序拆分为多个功能相对独立的部分。使用方法具有以下好处提高代码复用性相同功能不需要重复编写。提高代码可读性通过方法名称表达功能。降低维护成本修改某个功能时可以集中修改对应方法。便于分解问题将复杂问题拆分为多个简单任务。3.2 方法的定义在当前基础阶段可以先掌握以下常见写法publicstatic返回值类型 方法名(参数列表){// 方法体return返回值;}其中组成部分含义public访问修饰符static静态修饰符返回值类型表示方法返回结果的类型方法名用于标识并调用方法参数列表用于接收调用方法时传入的数据方法体方法实际执行的代码return结束当前方法可同时返回结果这里的public和static涉及后续的面向对象知识。现阶段可以先理解为使用static定义的静态方法可以在同一个类的静态main方法中直接通过方法名调用。3.3 方法的定义与调用以判断闰年为例。我们可以将判断逻辑封装成一个方法publicclassMethodDemo{// 判断一个年份是否为闰年publicstaticbooleanisLeapYear(intyear){return(year%40year%100!0)||year%4000;}publicstaticvoidmain(String[]args){intyear2024;booleanresultisLeapYear(year);if(result){System.out.println(是闰年);}else{System.out.println(不是闰年);}}}运行结果是闰年3.4 方法的返回值方法可以有返回值也可以没有返回值。3.4.1 有返回值的方法例如计算两个整数之和publicstaticintadd(inta,intb){returnab;}调用intresultadd(10,20);System.out.println(result);// 30这里的int表示方法返回一个整数结果。return a b;会将计算结果返回给调用方并结束当前方法。3.4.2 没有返回值的方法如果方法只负责输出信息不需要向调用者返回结果可以使用void。例如publicstaticvoidhello(){System.out.println(Hello Java);}调用hello();运行结果Hello Java注意有返回值的方法需要保证正常完成的执行路径符合返回值要求。void方法不返回结果但可以使用单独的return;提前结束方法。方法的返回类型需要与实际返回的表达式在 Java 类型规则下兼容。3.5 方法的参数方法可以通过参数接收外部传入的数据。例如publicstaticintadd(inta,intb){returnab;}这里的a、b就是方法定义中的参数。调用时add(10,20);向方法传入了两个实际数值。这就涉及两个重要概念形参和实参。3.6 形参和实参形参Formal Parameter形参是方法定义时声明的参数用于接收调用方传入的数据。例如publicstaticintadd(inta,intb)这里的a、b就是形参。实参Actual Argument实参是调用方法时提供的实际参数值或表达式。例如add(10,20);这里的10、20就是实参。方法调用时需要满足相应的参数匹配规则包括参数数量、类型兼容性以及参数顺序等。对于普通的位置参数调用实参与形参按位置对应。例如publicstaticvoidprintInfo(Stringname,intage){System.out.println(nameage);}正确调用printInfo(Tom,20);不能直接将两种不同类型的参数顺序颠倒// printInfo(20, Tom); // 编译错误3.7 Java 的参数传递值传递Java 的方法参数传递采用值传递Pass by Value。所谓值传递就是调用方法时将实参表达式计算得到的值复制一份用于初始化形参。对于基本数据类型形参与调用方的变量相互独立修改形参不会影响调用方变量的值。3.7.1 为什么 swap() 不能交换两个 int 变量先观察下面的代码publicclassTest{publicstaticvoidswap(intx,inty){inttempx;xy;ytemp;}publicstaticvoidmain(String[]args){inta10;intb20;swap(a,b);System.out.println(a a);System.out.println(b b);}}运行结果a 10 b 20明明在swap()中执行了交换操作为什么a和b的值没有改变3.7.2 结合方法调用栈理解Java 中每次方法调用都会创建对应的栈帧Stack Frame用于保存本次调用的局部变量及其他执行状态。① 调用 swap() 前此时只有main()方法的栈帧栈顶 ┌─────────────────┐ │ main() │ │ a 10 │ │ b 20 │ └─────────────────┘ 栈底② 调用 swap(a, b)执行swap(a, b)时会创建新的栈帧并将a、b的值分别复制给形参x、y。栈顶 ┌─────────────────┐ │ swap() │ │ x 10 │ │ y 20 │ ├─────────────────┤ │ main() │ │ a 10 │ │ b 20 │ └─────────────────┘ 栈底注意x、y与a、b是不同的局部变量。③ swap() 内部完成交换inttempx;xy;ytemp;此时栈顶 ┌─────────────────┐ │ swap() │ │ x 20 │ │ y 10 │ │ temp 10 │ ├─────────────────┤ │ main() │ │ a 10 │ │ b 20 │ └─────────────────┘ 栈底可以发现交换的只是swap()中的形参main()中的变量并未改变。④ swap() 执行结束swap()对应的栈帧退出程序返回main()继续执行。因此最终输出仍然是a 10 b 20以上栈帧图仅用于说明方法调用和局部变量之间的关系并非 JVM 的完整内存结构。四、方法重载在实际开发中有时多个方法完成的功能相似但需要处理的参数不同。例如计算两个整数之和。计算三个整数之和。计算两个浮点数之和。如果每个方法都使用不同名称可能降低代码的统一性。Java 提供了方法重载Method Overloading来解决这类问题。4.1 方法重载的概念方法重载是指在同一个类中允许定义多个名称相同、但参数列表不同的方法。构成方法重载需要满足方法名称相同。参数列表不同。其中参数列表不同可以体现为参数数量不同。参数类型不同。参数类型的排列顺序不同。注意方法的返回值类型不能单独作为判断重载的依据。4.2 方法重载示例publicclassOverloadDemo{// 两个整数相加publicstaticintadd(inta,intb){returnab;}// 三个整数相加publicstaticintadd(inta,intb,intc){returnabc;}// 两个 double 类型数据相加publicstaticdoubleadd(doublea,doubleb){returnab;}publicstaticvoidmain(String[]args){System.out.println(add(10,20));System.out.println(add(10,20,30));System.out.println(add(1.5,2.5));}}运行结果30 60 4.0虽然三个方法都叫add但参数列表不同因此可以构成方法重载。4.3 重载方法如何匹配在调用重载方法时Java 编译器会根据方法名称和实际参数按照方法调用的匹配规则选择合适的方法。例如add(10,20);两个参数都是int因此可以匹配add(inta,intb)如果调用add(1.5,2.5);则可以匹配add(doublea,doubleb)下一篇文章将介绍Java 程序调试Debug重点讲解 IntelliJ IDEA 中断点的设置、Debug 模式的使用、单步执行、变量值的观察以及方法调用过程的跟踪帮助读者掌握程序调试的基本方法学会分析代码执行流程、定位错误并进一步加深对方法调用和递归执行过程的理解。