第一部分:方法基础概念
方法是完成特定功能的代码块,可提高复用性、可读性与可维护性
学习目标
- 理解方法签名、形参、实参、返回值的概念
- 掌握方法的执行流程
- 区分无参、有参、无返回值、有返回值四种形态
调用者
→
方法签名
→
方法体
→
返回值
第二部分:方法定义与调用
1
基本语法结构
// 修饰符 返回类型 方法名(参数列表) { 方法体 }
public static int add(int a, int b) {
int sum = a + b;
return sum;
}
public static int add(int a, int b) {
int sum = a + b;
return sum;
}
2
四种常见形态
形态 | 示例 | 特点 |
---|---|---|
无参无返 | void printLine() |
仅执行操作 |
有参无返 | void printSum(int x,int y) |
依赖参数执行 |
无参有返 | int getRandom() |
返回计算结果 |
有参有返 | int max(int a,int b) |
最常用 |
3
调用示例
public static void main(String[] args) {
int result = add(3, 5); // 实参 -> 形参
System.out.println(result); // 8
}
int result = add(3, 5); // 实参 -> 形参
System.out.println(result); // 8
}
第三部分:参数传递机制
Java 只有值传递:基本类型传递“数据值”,引用类型传递“地址值”
1
基本类型传值
static void change(int x) { x = 99; }
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a); // 10 不变
}
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a); // 10 不变
}
2
引用类型传“地址值”
static void modifyArray(int[] arr) { arr[0] = 999; }
public static void main(String[] args) {
int[] nums = {1,2,3};
modifyArray(nums);
System.out.println(Arrays.toString(nums)); // [999,2,3]
}
public static void main(String[] args) {
int[] nums = {1,2,3};
modifyArray(nums);
System.out.println(Arrays.toString(nums)); // [999,2,3]
}
3
可变参数 (varargs)
static int sumAll(int... nums) {
int total = 0;
for (int n : nums) total += n;
return total;
}
// 调用:sumAll(1,2,3) 或 sumAll(new int[]{1,2})
int total = 0;
for (int n : nums) total += n;
return total;
}
// 调用:sumAll(1,2,3) 或 sumAll(new int[]{1,2})
第四部分:返回值与返回类型
1
单一返回
static double avg(int a, int b) {
return (a + b) / 2.0;
}
return (a + b) / 2.0;
}
2
多值返回(数组/对象)
static int[] minMax(int[] arr) {
Arrays.sort(arr);
return new int[]{arr[0], arr[arr.length-1]};
}
Arrays.sort(arr);
return new int[]{arr[0], arr[arr.length-1]};
}
3
提前返回
static boolean isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
if (n < 2) return false;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
第五部分:方法重载 Overloading
同一类中方法名相同、参数列表不同(个数或类型),与返回值无关
1
重载示例
static int add(int a, int b) { return a + b; }
static double add(double a, double b) { return a + b; }
static int add(int a, int b, int c) { return a + b + c; }
static double add(double a, double b) { return a + b; }
static int add(int a, int b, int c) { return a + b + c; }
第六部分:变量作用域与生命周期
局部变量
- 定义在方法、代码块、形参列表内
- 必须显式初始化
- 方法调用时创建,执行结束即销毁
成员变量
- 定义在类中、方法外
- 有默认值
- 随对象/类生命周期存在
public class ScopeDemo {
int x = 10; // 成员变量
void test(int y) { // y:形参局部变量
int z = 20; // 局部变量
}
}
int x = 10; // 成员变量
void test(int y) { // y:形参局部变量
int z = 20; // 局部变量
}
}
第七部分:常见错误与调试
错误1:返回值缺失
static int abs(int x) {
if (x >= 0) return x;
} // 编译错误:缺少return
if (x >= 0) return x;
} // 编译错误:缺少return
错误2:参数顺序错误
static void setRange(int start, int end) {
// 调用时写反:setRange(20,10)
}
// 调用时写反:setRange(20,10)
}
错误3:无限递归
static int fact(int n) {
return n * fact(n); // 缺少终止条件
}
return n * fact(n); // 缺少终止条件
}
第八部分:实战演练
项目:简易计算器
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("a="); double a = sc.nextDouble();
System.out.print("b="); double b = sc.nextDouble();
System.out.println("和: " + add(a,b));
System.out.println("差: " + subtract(a,b));
System.out.println("积: " + multiply(a,b));
System.out.println("商: " + divide(a,b));
}
static double add(double x, double y) { return x + y; }
static double subtract(double x, double y) { return x - y; }
static double multiply(double x, double y) { return x * y; }
static double divide(double x, double y) {
if (y == 0) {
System.out.println("除数不能为0");
return Double.NaN;
}
return x / y;
}
}
public class Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("a="); double a = sc.nextDouble();
System.out.print("b="); double b = sc.nextDouble();
System.out.println("和: " + add(a,b));
System.out.println("差: " + subtract(a,b));
System.out.println("积: " + multiply(a,b));
System.out.println("商: " + divide(a,b));
}
static double add(double x, double y) { return x + y; }
static double subtract(double x, double y) { return x - y; }
static double multiply(double x, double y) { return x * y; }
static double divide(double x, double y) {
if (y == 0) {
System.out.println("除数不能为0");
return Double.NaN;
}
return x / y;
}
}
学习总结
- 方法 = 功能 + 复用 + 可读
- Java 只有值传递(地址值也是值)
- 返回值必须与声明类型匹配
- 重载只看参数列表,不看返回类型
- 局部变量必须初始化且作用域最小