【从零开始java学习|第九篇】方法的相关知识与练习
目录
一、方法的本质与基本格式
1. 什么是方法?
2. 方法的基本格式
二、方法的定义与调用
1. 最简单的方法(无参数、无返回值)
2. 带参数的方法
3. 带返回值的方法
三、方法的重载(Overload)
1. 什么是方法重载?
四、方法的实战练习
1. 练习 1:遍历数组求最大值
2. 练习 2:判断元素是否存在
3. 练习 3:拷贝数组
五、方法的内存原理
六、数据类型:基本类型与引用类型
七、方法的值传递
1. 基本类型的值传递
2. 引用类型的值传递
八、学习总结
一、方法的本质与基本格式
1. 什么是方法?
方法(Method)是一段封装特定功能的可重用代码块,相当于一个 "功能模块"。它可以接收输入参数,执行特定操作,并返回结果(可选)。
核心作用:
- 实现代码复用(避免重复编写相同逻辑)
- 提高代码可读性(将复杂逻辑拆分到不同方法)
- 便于维护(修改方法即可影响所有调用处)
2. 方法的基本格式
修饰符 返回值类型 方法名(参数列表) {// 方法体(功能实现代码)[return 返回值;] // 可选,根据返回值类型决定
}
- 修饰符:控制方法的访问权限(如
public
、private
,初学者常用public static
) - 返回值类型:方法执行后返回结果的类型(无返回值用
void
) - 方法名:遵循小驼峰命名法(如
getSum
、printInfo
) - 参数列表:方法接收的输入数据(格式:
数据类型 参数名, ...
,可空) - 方法体:实现具体功能的代码
- 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),遵循 "先进后出" 原则:
- 方法调用时:JVM 在栈中为方法开辟一块内存(称为 "栈帧"),存储方法的参数、局部变量等。
- 方法执行时:在栈帧中执行方法体代码。
- 方法结束时:栈帧被销毁(局部变量随之释放),程序回到调用处继续执行
示例: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=1
、b=2
- 调用
sum
方法,sum
方法入栈,参数x=1
、y=2
sum
执行完毕,返回结果 3,sum
栈帧销毁main
方法接收结果 3,继续执行打印,最后main
栈帧销毁
六、数据类型:基本类型与引用类型
方法的值传递与数据类型密切相关,首先明确两类数据类型的区别:
类型 | 包含的数据类型 | 存储方式 |
---|---|---|
基本数据类型 | byte 、short 、int 、long 、float 、double 、char 、boolean | 直接存储值本身,存于栈内存 |
引用数据类型 | 数组、类、接口、字符串等 | 存储对象的内存地址,值存于堆内存 |
示例:
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 编程的核心组件,从基础到进阶的学习路径可概括为:
- 理解方法的本质:封装功能,实现复用
- 掌握方法的定义与调用:从无参无返回值,到带参带返回值
- 灵活运用方法重载:让相同功能适配不同参数
- 理解内存原理:栈帧的创建与销毁过程
- 区分数据类型:基本类型存值,引用类型存地址
- 掌握值传递:传递副本,修改影响取决于类型
通过方法的合理设计,可以将复杂程序拆解为多个清晰的功能模块,大幅提升代码质量和开发效率。
如果我的内容对你有帮助,请点赞,评论,收藏。接下来我将继续更新相关内容!