当前位置: 首页 > news >正文

【从零开始java学习|第九篇】方法的相关知识与练习

目录

一、方法的本质与基本格式

1. 什么是方法?

2. 方法的基本格式

二、方法的定义与调用

1. 最简单的方法(无参数、无返回值)

2. 带参数的方法

3. 带返回值的方法

三、方法的重载(Overload)

1. 什么是方法重载?

四、方法的实战练习

1. 练习 1:遍历数组求最大值

2. 练习 2:判断元素是否存在

3. 练习 3:拷贝数组

五、方法的内存原理

六、数据类型:基本类型与引用类型

七、方法的值传递

1. 基本类型的值传递

2. 引用类型的值传递

八、学习总结


一、方法的本质与基本格式

1. 什么是方法?

方法(Method)是一段封装特定功能的可重用代码块,相当于一个 "功能模块"。它可以接收输入参数,执行特定操作,并返回结果(可选)。

核心作用

  • 实现代码复用(避免重复编写相同逻辑)
  • 提高代码可读性(将复杂逻辑拆分到不同方法)
  • 便于维护(修改方法即可影响所有调用处)

2. 方法的基本格式

修饰符 返回值类型 方法名(参数列表) {// 方法体(功能实现代码)[return 返回值;] // 可选,根据返回值类型决定
}
  • 修饰符:控制方法的访问权限(如publicprivate,初学者常用public static
  • 返回值类型:方法执行后返回结果的类型(无返回值用void
  • 方法名:遵循小驼峰命名法(如getSumprintInfo
  • 参数列表:方法接收的输入数据(格式:数据类型 参数名, ...,可空)
  • 方法体:实现具体功能的代码
  • return 语句:返回结果并结束方法(返回值类型为void时可省略)

二、方法的定义与调用

1. 最简单的方法(无参数、无返回值)

定义:不接收参数,也不返回结果,仅执行特定操作(如打印信息)。

// 定义方法
public static void sayHello() {System.out.println("Hello, Method!");
}// 调用方法:方法名()
public static void main(String[] args) {sayHello(); // 输出:Hello, Method!
}

2. 带参数的方法

定义:接收外部传入的参数,根据参数执行操作(参数相当于方法的 "原材料")。

// 定义带参数的方法:计算两个整数的和并打印
public static void printSum(int a, int b) { // int a, int b 是参数列表int sum = a + b;System.out.println(a + " + " + b + " = " + sum);
}// 调用方法:方法名(实际参数)
public static void main(String[] args) {printSum(3, 5); // 传入实际参数3和5,输出:3 + 5 = 8printSum(10, 20); // 可重复调用,输出:10 + 20 = 30
}

注意:调用时实际参数的类型、数量必须与方法定义的形式参数完全匹配。

3. 带返回值的方法

定义:执行完成后返回一个结果,调用者可以使用该结果(返回值相当于方法的 "产出物")。

// 定义带返回值的方法:计算两个数的乘积
public static int multiply(int a, int b) {int result = a * b;return result; // 返回计算结果(类型必须与方法声明的int一致)
}// 调用方法:用变量接收返回值
public static void main(String[] args) {int product = multiply(4, 5); // 接收返回值20System.out.println("乘积:" + product); // 输出:乘积:20// 也可直接使用返回值System.out.println("乘积的2倍:" + multiply(3, 6) * 2); // 输出:36
}

注意

  • 方法声明的返回值类型与return语句的实际返回值类型必须一致
  • 若返回值类型为void,则方法内不能有return语句(或仅写return;表示提前结束)

小结:

三、方法的重载(Overload)

什么是方法重载?

同一个类中,多个方法具有相同的方法名,但参数列表不同参数类型、数量或顺序不同),称为方法重载。

作用:让同一功能的方法可以接收不同类型 / 数量的参数,调用时更灵活。

// 重载示例:计算和的方法,支持不同参数
public class OverloadDemo {// 两个int相加public static int getSum(int a, int b) {return a + b;}// 三个int相加(参数数量不同)public static int getSum(int a, int b, int c) {return a + b + c;}// 两个double相加(参数类型不同)public static double getSum(double a, double b) {return a + b;}public static void main(String[] args) {System.out.println(getSum(1, 2)); // 调用两个int的方法,输出3System.out.println(getSum(1, 2, 3)); // 调用三个int的方法,输出6System.out.println(getSum(1.5, 2.5)); // 调用两个double的方法,输出4.0}
}

判断重载的核心:仅看方法名和参数列表,与返回值类型、修饰符无关。

四、方法的实战练习

1. 练习 1:遍历数组求最大值

需求:定义方法,接收 int 数组,返回数组中的最大值。

public class ArrayMax {// 定义方法:接收数组,返回最大值public static int getMax(int[] arr) {if (arr == null || arr.length == 0) {throw new IllegalArgumentException("数组不能为null或空");}int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}public static void main(String[] args) {int[] numbers = {5, 9, 3, 12, 7};int maxValue = getMax(numbers);System.out.println("数组最大值:" + maxValue); // 输出:12}
}

2. 练习 2:判断元素是否存在

需求:定义方法,接收 int 数组和目标值,返回目标值是否在数组中。

public class ElementExists {// 定义方法:检查target是否在arr中public static boolean contains(int[] arr, int target) {if (arr == null) {return false;}for (int num : arr) {if (num == target) {return true; // 找到则返回true}}return false; // 遍历完仍未找到,返回false}public static void main(String[] args) {int[] numbers = {2, 4, 6, 8};System.out.println(contains(numbers, 6)); // 输出:trueSystem.out.println(contains(numbers, 5)); // 输出:false}
}

3. 练习 3:拷贝数组

需求:定义方法,接收原数组,返回一个新数组(与原数组元素相同)。

public class ArrayCopy {// 定义方法:拷贝原数组到新数组public static int[] copyArray(int[] original) {if (original == null) {return null;}int[] copy = new int[original.length]; // 创建同长度的新数组for (int i = 0; i < original.length; i++) {copy[i] = original[i]; // 逐个复制元素}return copy;}public static void main(String[] args) {int[] source = {10, 20, 30};int[] target = copyArray(source);// 验证拷贝结果System.out.println("原数组:" + java.util.Arrays.toString(source)); // [10, 20, 30]System.out.println("新数组:" + java.util.Arrays.toString(target)); // [10, 20, 30]}
}

五、方法的内存原理

方法的执行依赖栈内存(Stack),遵循 "先进后出" 原则:

  1. 方法调用时:JVM 在栈中为方法开辟一块内存(称为 "栈帧"),存储方法的参数、局部变量等。
  2. 方法执行时:在栈帧中执行方法体代码。
  3. 方法结束时:栈帧被销毁(局部变量随之释放),程序回到调用处继续执行

示例main方法调用sum方法的内存过程

public static void main(String[] args) {int a = 1;int b = 2;int result = sum(a, b); // 调用sum方法System.out.println(result);
}public static int sum(int x, int y) {return x + y;
}

内存过程:

  • main方法入栈,创建变量a=1b=2
  • 调用sum方法,sum方法入栈,参数x=1y=2
  • sum执行完毕,返回结果 3,sum栈帧销毁
  • main方法接收结果 3,继续执行打印,最后main栈帧销毁

六、数据类型:基本类型与引用类型

方法的值传递与数据类型密切相关,首先明确两类数据类型的区别:

类型包含的数据类型存储方式
基本数据类型byteshortintlongfloatdoublecharboolean直接存储值本身,存于栈内存
引用数据类型数组、类、接口、字符串等存储对象的内存地址,值存于堆内存

示例

int num = 10; // 基本类型:栈中直接存10
int[] arr = {1, 2, 3}; // 引用类型:栈中存数组在堆中的地址(如0x123)

七、方法的值传递

Java 中方法的参数传递遵循值传递原则:方法接收的是实际参数的副本(拷贝值),而非参数本身。

1. 基本类型的值传递

传递的是值的副本,方法内修改副本不会影响原变量。

public static void main(String[] args) {int a = 10;change(a);System.out.println(a); // 输出:10(原变量未变)
}public static void change(int x) {x = 20; // 修改的是副本x,与原变量a无关
}

2. 引用类型的值传递

传递的是地址的副本,方法内通过地址修改对象内容会影响原对象(但修改地址本身不影响原引用)。

public static void main(String[] args) {int[] arr = {10, 20};changeArray(arr);System.out.println(arr[0]); // 输出:100(原数组被修改)
}public static void changeArray(int[] x) {// x是arr地址的副本,通过x修改数组内容会影响原数组x[0] = 100; // 修改x的地址(指向新数组),不影响原arrx = new int[]{30, 40}; 
}

总结:值传递的核心是 "传递副本",基本类型副本是值,引用类型副本是地址。

八、学习总结

方法是 Java 编程的核心组件,从基础到进阶的学习路径可概括为:

  1. 理解方法的本质:封装功能,实现复用
  2. 掌握方法的定义与调用:从无参无返回值,到带参带返回值
  3. 灵活运用方法重载:让相同功能适配不同参数
  4. 理解内存原理:栈帧的创建与销毁过程
  5. 区分数据类型:基本类型存值,引用类型存地址
  6. 掌握值传递:传递副本,修改影响取决于类型

通过方法的合理设计,可以将复杂程序拆解为多个清晰的功能模块,大幅提升代码质量和开发效率。

如果我的内容对你有帮助,请点赞,评论,收藏。接下来我将继续更新相关内容!

http://www.xdnf.cn/news/1349011.html

相关文章:

  • 【微服务的数据一致性分发问题】究极解决方案
  • 日志的配置
  • 一键部署openGauss6.0.2轻量版单节点
  • Spring原理
  • 最近 | 黄淮教务 | 小工具合集
  • 世界模型一种能够对现实世界环境进行仿真,并基于文本、图像、视频和运动等输入数据来生成视频、预测未来状态的生成式 AI 模型
  • Maxscript如何清理3dMax场景?
  • 打工人日报20250822
  • More Effective C++ 条款01:仔细区别 pointers 和 references
  • Java设计模式-外观模式
  • 滑动窗口+子串+普通数组算法
  • Elasticsearch搜索原理
  • HEVC(H.265)与HVC1的关系及区别
  • Unreal Engine UProjectileMovementComponent
  • 异步开发的三种实现方式
  • Unreal Engine USceneComponent
  • Unreal Engine Simulate Physics
  • 线段树01
  • 20250822 组题总结
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘uvicorn’问题
  • 北京-测试-入职甲方金融-上班第三天
  • 嵌入式第三十五天(网络编程(UDP))
  • GPS欺骗式干扰的产生
  • DSPy框架:从提示工程到声明式编程的革命性转变
  • 声网SDK更新,多场景抗弱网稳定性大幅增强
  • GaussDB GaussDB 数据库架构师修炼(十八)SQL引擎(1)-SQL执行流程
  • week3-[二维数组]小方块
  • ArrayList线程不安全问题及解决方案详解
  • 硬件驱动---linux内核驱动 启动
  • 云原生俱乐部-k8s知识点归纳(7)