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 将其称为不可达的语句。

相关新闻

掌握1对1与1对多数据库关系

掌握1对1与1对多数据库关系

1.1对1何为1对1 2个表互相对照对方 没有其他的表 在生活中常见的1对1关系有作者和作者信息 一个作者只有一个信息 这个信息只能是这个作者作者 李白 信息 朝代、年龄、笔名如果将作者删除那么 信息也会跟着一起删除 两个表是关联的关系然后是操作1.查所有的作者 作者下带着资…

2026/9/3 0:37:51 阅读更多 →
不同系统下设置静态IP

不同系统下设置静态IP

虽然所有 Linux 系统在底层的内核操作是相同的(临时配置都可以用 ip 或 ifconfig),但让静态 IP 永久生效的配置文件格式、路径以及后台网络管理服务,在不同操作系统中截然不同。各大常见系统设置静态 IP 的机制对比与操作示例说明…

2026/9/3 12:21:58 阅读更多 →
3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-e…

2026/8/23 9:49:22 阅读更多 →

最新新闻

STM32驱动GXHT30温湿度传感器:I2C通信与CRC校验实战

STM32驱动GXHT30温湿度传感器:I2C通信与CRC校验实战

简介:面向STM32微控制器的GXHT30温湿度传感器I2C驱动示例工程,演示如何通过I2C协议从传感器读取温度与湿度数据,适用于智能家居、物联网节点、环境监测等低功耗嵌入式场景。压缩包体积仅3KB,共包含2个文件,即一个iic.c…

2026/9/3 19:57:18 阅读更多 →
STM32F407+FreeRTOS+LwIP+KSZ8031边缘联动控制器实战解析

STM32F407+FreeRTOS+LwIP+KSZ8031边缘联动控制器实战解析

简介:面向嵌入式开发者的STM32F407综合参考工程,整合FreeRTOS实时内核与LWIP网络协议栈,基于KSZ8031实现RMII接口网卡驱动,并移植FATFS文件系统,配合自写的嵌入式WebServer完成多模块联调。工程还包含GPIO输入输出、CA…

2026/9/3 19:57:18 阅读更多 →
2D板材套料开源代码全解析:从算法原理到应用调优

2D板材套料开源代码全解析:从算法原理到应用调优

简介:这套2D板材排版套料开源代码(SVGnest)是一份基于遗传算法优化排版的完整实现,专为激光切割、水切割等制造场景设计,适合希望研究套料算法或开发类似排版工具的开发者。压缩包共包含88个文件,大小仅2.5…

2026/9/3 19:57:18 阅读更多 →
基于YOLOv8与PySide6的金属表面缺陷检测系统实践

基于YOLOv8与PySide6的金属表面缺陷检测系统实践

工业金属表面缺陷检测,一直是制造质检里最消耗人力的环节之一。过去靠老师傅肉眼盯产线,时间久了容易疲劳,漏检率不稳定;后来有了传统机器视觉,但光照变化、纹理复杂、缺陷形态多样,固定规则很难覆盖。近几…

2026/9/3 19:57:18 阅读更多 →
STM32+lwip+FreeRTOS串口转TCP服务器实战解析

STM32+lwip+FreeRTOS串口转TCP服务器实战解析

简介:lwip-2.0.3 是一份面向嵌入式与物联网开发者的轻量级 TCP/IP 协议栈源码资源,专为单片机、传感器节点等 RAM 受限设备提供完整的网络通信能力,并支持以太网、PPP、Wi-Fi 等不同硬件接口。资源包为 zip 格式,压缩后约 2.94MB&…

2026/9/3 19:57:18 阅读更多 →
SHT30温湿度传感器与STM32F4的I2C驱动开发:从原理到工程实践

SHT30温湿度传感器与STM32F4的I2C驱动开发:从原理到工程实践

简介:基于STM32F407与SHT30温湿度传感器的工程代码,面向物联网设备、环境监控、智能家居等场景的开发者,尤其适合刚接触模拟IIC通信的单片机爱好者。包内共3个文件,保留SHT30驱动C源文件、头文件,以及配套PDF说明文档&…

2026/9/3 19:56:17 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开,这不是劝退文,而是想讲清楚一件事:用 AI 做逆向值不值得学?如果要用,怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词,很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 0:00:29 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →