公司动态

JavaSE 基础语法 - 方法的使用 - ①

📅 2026/7/24 20:16:06
JavaSE 基础语法 - 方法的使用 - ①
在实际开发中一个完整的程序往往由成千上万个方法组成。例如我们每天使用的微信、支付宝、淘宝等应用每点击一个按钮、发送一条消息、完成一次支付背后都会调用不同的方法来完成相应的功能。那么什么是方法为什么要使用方法先来看一个简单的例子。假设现在需要计算两个整数的和。第一次inta10;intb20;System.out.println(ab);第二次inta100;intb200;System.out.println(ab);第三次inta1000;intb2000;System.out.println(ab);如果程序中有几十甚至几百处这样的计算我们只能不断地复制粘贴代码。这种做法不仅会增加代码量还会降低程序的可维护性。例如当计算逻辑发生变化时我们需要逐个修改所有地方很容易出现遗漏。因此我们需要一种机制把完成同一功能的代码封装起来在需要的时候直接调用。这种机制就是方法Method。一、什么是方法概念方法Method是完成某个特定功能的一段代码它能够被重复调用从而实现代码复用。简单来说方法就是将具有独立功能的代码封装起来并通过方法名进行调用。例如我们每天都会使用手机的拍照功能。拍照时我们并不需要关心相机如何打开如何自动对焦如何调整曝光如何保存图片我们只需要点击拍照按钮即可。这里的拍照就可以理解为一个方法。程序开发也是一样。例如Java 已经为我们提供了很多现成的方法System.out.println(Hello Java);其中println()就是一个方法它负责完成输出内容到控制台这一功能。我们只需要调用它而不用关心它内部是如何实现的。特点一个方法通常具有以下特点完成一个独立的功能可以被多次调用能够接收数据参数可以返回计算结果能够提高代码的复用性。例如publicstaticvoidprintHello(){System.out.println(Hello Java);}以后只需要调用 printHello() 这个函数就可以重复执行该功能。二、为什么需要方法在程序开发中我们经常会遇到大量重复代码。例如某学校管理系统需要多次输出欢迎信息。没有使用方法时System.out.println( 欢迎使用学生管理系统 );System.out.println(1. 添加学生);System.out.println(2. 删除学生);System.out.println(3. 修改学生);System.out.println(4. 查询学生);System.out.println( 欢迎使用学生管理系统 );System.out.println(1. 添加学生);System.out.println(2. 删除学生);System.out.println(3. 修改学生);System.out.println(4. 查询学生);可以发现同一段代码被重复编写了两次。如果菜单内容发生变化例如增加一个新的功能那么所有地方都需要修改。显然这样的程序维护成本非常高。如果这时候使用方法来进行封装publicstaticvoidprintMenu(){System.out.println( 欢迎使用学生管理系统 );System.out.println(1. 添加学生);System.out.println(2. 删除学生);System.out.println(3. 修改学生);System.out.println(4. 查询学生);}需要显示菜单时只需要调用printMenu();printMenu();程序运行结果与之前完全一致但代码更加简洁。方法带来的优势1、提高代码复用性同一段代码只需要编写一次就可以多次调用。例如printMenu();可以随时重复使用。2、降低维护成本如果菜单内容需要修改只需要修改方法中的代码即可。例如publicstaticvoidprintMenu(){System.out.println( 欢迎使用学生管理系统 );System.out.println(1. 添加学生);System.out.println(2. 删除学生);System.out.println(3. 修改学生);System.out.println(4. 查询学生);System.out.println(5. 退出系统);}所有调用该方法的地方都会自动生效。3、提高代码可读性比如说看到打印菜单的方法我们就可以立马知道当前代码的作用就是输出菜单方法名能够很好的表达程序意图。4、符合模块化开发思想一个大型项目通常会被拆分成多个模块。例如用户登录商品管理订单管理支付功能每个模块内部又包含许多方法。这样能够使整个项目结构更加清晰也便于团队协作开发。方法不是越多越好刚学的时候可能认为“为了提高复用性把每一行代码都封装成一个方法。”这种做法其实并不可取。例如publicstaticvoidprintOne(){System.out.println(1);}publicstaticvoidprintTwo(){System.out.println(2);}这种方法没有实际意义反而增加了阅读成本。因此一个好的方法应该遵循一个方法只完成一项独立的功能。这也是软件开发中较常见的单一职责原则。三、方法的定义在现阶段中定义一个方法的基本语法如下访问修饰符static返回值类型 方法名(参数列表){方法体}例如publicstaticvoidsayHello(){System.out.println(Hello Java);}这是一个最简单的方法。它的作用就是输出Hello Java方法定义的语法格式publicstaticvoid方法名(){}例如publicstaticvoidprintLine(){System.out.println(------------------------);}以后只需要调用printLine() , 就可以输出分割线。方法定义的位置在 Java 中方法必须定义在类Class中。例如publicclassDemo{publicstaticvoidprintHello(){System.out.println(Hello);}}在 Java 中从 Java 16 开始允许在方法内部定义方法这叫做局部方法Local Method但必须是 static 上下文且不能有访问修饰符。publicclassDemo{publicstaticvoidmain(String[]args){// Java 16 支持voidprint(){System.out.println(Hello);}print();}}目前这个阶段我们暂时不讨论。四、方法的组成一个完整的方法由多个部分组成。例如publicstaticintsum(inta,intb){returnab;}组成部分说明public访问修饰符static静态关键字int返回值类型sum方法名(int a, int b)参数列表{}方法体return返回结果4.1 访问修饰符public访问修饰符用于控制方法的访问权限。目前学习阶段我们统一使用public表示任何地方都可以访问该方法。后续学习面向对象时还会学习到privateprotected默认访问权限4.2 static 关键字目前定义的方法都会写static它表示当前方法属于类可以直接通过类名或者在 main 方法中直接调用。关于static的具体作用我们将在后续《面向对象》章节进行详细讲解。现阶段只需要记住定义方法时先写上 static 即可。4.3 返回值类型返回值表示方法执行完成后是否需要把结果返回给调用者。例如void表示没有返回值。publicstaticvoidprintHello(){}而int表示方法会返回一个整数。publicstaticintsum(inta,intb){}4.4 方法名方法名就是方法的名称。比如说printHello()中的printHello就是方法名。方法名建议遵循以下规范使用小驼峰命名法名称要见名知意一般使用动词开头。例如login()printMenu()calculateTotal()findStudent()都属于比较规范的方法命名。4.5 参数列表参数用于接收调用者传递的数据。(int a, int b)表示方法需要两个整数。如果没有参数()括号不能为空省略必须要写。4.6 方法体方法体就是{ }里面编写的代码。例如publicstaticvoidprintHello(){System.out.println(Hello Java);}System.out.println(Hello Java);这里就是方法体中的代码。五、方法的调用定义好方法之后并不会自动执行。只有调用方法时方法中的代码才会运行。例如publicclassDemo{publicstaticvoidprintHello(){System.out.println(Hello Java);}publicstaticvoidmain(String[]args){printHello();}}printHello();这里就是方法调用。在定义方法的时候只是创建了方法调用方法的时候才会真正的去执行。六、形参与实参publicstaticvoidprintSum(inta,intb){System.out.println(ab);}调用printSum(10, 20)的时候这里的a、b和10、20到底是什么关系为什么调用方法时把10、20传进去方法里面就可以直接使用a、b要理解这一点就需要先认识两个概念形参Formal Parameter形式参数实参Actual Parameter实际参数什么是形参形参全称形式参数。是在定义方法时声明的参数变量。例如publicstaticvoidprintSum(inta,intb){System.out.println(ab);}这里的int a 和 int b就是两个形参。形参可以理解为一种特殊的局部变量它们在方法被调用时由实参赋值初始化。它们只有在方法执行时才会创建方法结束后就会被销毁。因此形参并不会一直存在于程序中。什么是实参实参全称实际参数。是在调用方法时真正传递给方法的数据。例如printSum(10,20);这里的10 和 20就是实参。实参不仅可以是具体的数据还可以是变量。例如intx10;inty20;printSum(x,y);这里的x 和 y同样属于实参。形参与实参之间的关系很多人都误以为“调用方法以后形参就是实参。”其实并不是。正确的理解应该是调用方法时实参会把自己的值复制一份交给形参。例如intx10;print(x);对应的方法publicstaticvoidprint(intnum){System.out.println(num);}整个过程可以理解为调用之前-x10调用时-复制了一份数据-赋值给了 num-num10因此x和num其实是两个完全不同的变量只是它们保存的数据是一样的而已。修改其中一个变量的值的时候这个时候不会影响到另一个变量。完整的示例例如publicclassDemo{publicstaticvoidprintAge(intage){System.out.println(年龄age);}publicstaticvoidmain(String[]args){intmyAge18;printAge(myAge);}}这里位置属于什么age形参myAge实参变量18实际的数据值调用时myAge ↓18↓ 复制 ↓ age ↓18因此方法内部操作的是age而不是myAge七、方法调用过程栈内存分析很多初学者学习方法时都会有一个疑问方法调用之后到底发生了什么理解这一点对后续学习数组、面向对象、递归以及 JVM都非常重要。下面通过一个简单的例子分析方法调用过程。publicclassDemo{publicstaticvoidprint(intnum){System.out.println(num);}publicstaticvoidmain(String[]args){inta10;print(a);}}第一步程序启动JVM 启动后会加载包含 main 方法的类然后调用public static void main(String[] args)作为程序入口。此时main()方法进入栈内存Stack。栈内存 ┌──────────────┐ │main()│ └──────────────┘然后执行inta10;此时栈内存 ┌──────────────┐ │main()│ │ a10│ └──────────────┘第二步调用方法执行print(a);Java 会进入print(intnum)// 进入这个方法内部于是JVM 会为print()方法再创建一块新的栈空间栈帧。栈内存 ┌──────────────┐ │print()│ │ num10│ ├──────────────┤ │main()│ │ a10│ └──────────────┘这里的num就是复制得到的10并不是a本身。第三步执行方法体进入System.out.println(num);输出10第四步方法执行结束执行完成后print()立即结束。对应的栈帧立即释放。于是栈内存 ┌──────────────┐ │main()│ │ a10│ └──────────────┘可以看到方法结束以后num以及不存在了因为它只是print()方法里面的局部变量。方法调用遵循先进后出Java 的方法调用采用栈Stack结构。栈有两个特点后进入的方法先执行结束先进入的方法最后结束。例如main()↓methodA()↓methodB()执行顺序main()↓methodA()↓methodB()↓methodB()结束 ↓methodA()结束 ↓main()结束这种结构称为先进后出Last In First OutLIFO后续学习 JVM 时我们会详细介绍栈帧Stack Frame的组成。八、无返回值方法8.1 无参无返回值方法无参无返回值方法是最简单的一类方法。它既不需要接收数据也不会返回结果。语法如下publicstaticvoid方法名(){方法体}例如publicstaticvoidmain(String[]args){printLine();// 调用方法打印分割线System.out.println(欢迎学习 Java);printLine();}这种方法通常用于输出菜单打印分隔线输出提示信息记录日志8.2 有参无返回值方法很多时候一个方法需要根据不同的数据执行不同的操作。例如输出不同用户的姓名。如果没有参数publicstaticvoidprintName(){System.out.println(张三);}无论调用多少次都只能输出固定内容。为了提高方法的灵活性我们可以为方法添加参数。例如publicstaticvoidprintName(Stringname){System.out.println(name);}调用printName(张三);printName(李四);printName(王五);可以看到同一个方法能够处理不同的数据而无需重复编写多个方法。再例如计算并输出两个整数的和publicstaticvoidprintSum(inta,intb){System.out.println(ab);}调用printSum(10,20);printSum(100,200);printSum(5,8);与无参方法相比有参方法最大的优势在于方法的逻辑保持不变但可以通过参数处理不同的数据提高了代码的灵活性和复用性。九、有返回值方法例如publicstaticvoidprintSum(inta,intb){System.out.println(ab);}虽然能够输出结果。但是如果我们需要继续使用这个计算结果呢例如计算两个数的和再继续参与其他计算。此时仅仅输出结果已经不能满足需求。因此就需要使用有返回值方法。什么是返回值返回值就是方法执行完成以后把计算结果返回给调用者。例如publicstaticintsum(inta,intb){returnab;}这里的int表示方法最终会返回一个整数。调用intresultsum(10,20);System.out.println(result);// 运行结果30整个执行过程sum(10,20)↓30↓ result ↓ 输出返回值类型必须一致例如publicstaticintgetAge(){return18;}返回值类型int所以必须返回int。注意返回值的类型必须与声明类型兼容即可以发生隐式类型转换否则编译报错。一个完整案例编写一个方法计算圆的面积。publicstaticdoublegetArea(doubleradius){return3.14*radius*radius;}调用doubleareagetArea(5);System.out.println(area);// 输出78.5可以看到计算逻辑被封装在方法内部。调用者只需要获取最终结果即可。十、return 关键字在 Java 中return是方法中非常重要的关键字。它主要有两个作用。作用一返回数据例如publicstaticintadd(inta,intb){returnab;}这里的return表示把a b返回给调用者比如说调用intresultadd(10,20);实际上是把计算好的结果返回回来,赋值给result。作用二结束方法即使方法没有返回值也可以使用return来提前结束方法。例如publicstaticvoidcheckAge(intage){if(age18){System.out.println(未成年);return;}System.out.println(允许进入);}调用checkAge(15);输出 未成年 执行到return方法立即结束。后面的代码System.out.println(允许进入);不会执行了。return 后面不能再写代码例如publicstaticvoidtest(){return;System.out.println(Hello);}编译错误。因为执行了return后方法已经结束。后面的代码永远不会执行。Java 将其称为不可达的语句。