
方法的定义方法是一段封装特定功能的、可重复调用的代码块。语法格式修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ...) { 方法体 return 返回值; }各组成部分说明组成部分说明修饰符控制访问权限和调用方式如public static返回值类型方法返回结果的数据类型无返回值用void方法名小驼峰命名见名知意参数列表形式参数形参多个用逗号分隔无参数则留空方法体实现功能的具体代码return结束方法执行并返回结果void方法可省略或用return;提前退出示例public static int getMax(int num1, int num2) { if (num1 num2) { return num1; } else { return num2; } } int max getMax(10, 20); // max 20方法定义后不会自动执行必须通过方法名(实参)显式调用。方法的分类按是否有参数和是否有返回值方法分为四类分类声明示例调用方式无参无返回值public static void printHello()printHello();无参有返回值public static String getGreeting()String s getGreeting();有参无返回值public static void printInfo(String name)printInfo(Tom);有参有返回值public static int add(int a, int b)int sum add(3, 5);形参和实参形参方法定义时括号中的变量是占位符实参调用方法时传入的具体值要求实参的类型、数量、顺序必须与形参一致否则编译报错。public static int add(int num1, int num2) { // num1、num2 是形参 return num1 num2; } add(10, 20); // 10、20 是实参 add(a, 3); // 实参可以是变量 add(2 3, a * 2); // 实参可以是表达式方法重载规则同一个类中方法名相同、参数列表不同构成方法重载。判断条件说明方法名必须相同参数个数不同即构成重载参数类型不同即构成重载参数顺序不同即构成重载如(int, double)与(double, int)与返回值类型无关与参数名无关。以下写法不构成重载会编译报错// 编译错误仅返回值类型不同 public static int add(int a, int b) { return a b; } public static double add(int a, int b) { return a b; } // 编译错误仅参数名不同 public static int add(int a, int b) { return a b; } public static int add(int x, int y) { return x y; }原因add(1, 2)调用时编译器无法根据返回值判断目标方法。重载匹配顺序编译器按以下优先级匹配重载方法精确类型匹配自动类型提升byte→short→int→long→float→double自动装箱/拆箱可变参数优先级最低public static void test(long a) { System.out.println(long); } public static void test(double a) { System.out.println(double); } test(10); // 输出 longint → long 比 int → double 更近重载示例public class OverloadDemo { public static int add(int a, int b) { return a b; } public static double add(double a, double b) { // 参数类型不同 return a b; } public static int add(int a, int b, int c) { // 参数个数不同 return a b c; } public static double add(int a, double b) { // 参数顺序不同 return a b; } }值传递Java 只有一种参数传递方式值传递。实参将自身的值复制一份传给形参方法内对形参的修改不影响实参。值的含义取决于实参类型实参类型传递的值方法内修改的影响基本类型数据值本身不影响实参引用类型堆内存地址的副本修改地址本身不影响实参修改地址指向的对象内容会影响原对象基本类型public static void change(int x) { x 100; // 修改的是副本 } int a 10; change(a); System.out.println(a); // 10不受影响引用类型修改对象内容public static void changeContent(int[] arr) { arr[0] 100; // arr 与实参指向同一对象 } int[] a {1, 2}; changeContent(a); System.out.println(a[0]); // 100原数组内容被修改引用类型修改引用本身public static void changeRef(int[] arr) { arr new int[]{3, 4}; // arr 指向新对象不影响实参 } int[] a {1, 2}; changeRef(a); System.out.println(a[0]); // 1原数组未受影响方法调用内存模型JVM 内存分区内存区域作用栈Stack每个线程独享存储方法调用栈帧局部变量、形参、返回地址。方法调用入栈执行完毕出栈堆Heap所有线程共享存储对象实例和数组。栈中的引用变量存储的是堆地址方法调用流程public static int add(int x, int y) { int result x y; return result; } public static void main(String[] args) { int a 10; int b 20; int sum add(a, b); }执行步骤main入栈栈帧中存储a10、b20调用add(a, b)a10、b20的值复制给形参x、yadd栈帧入栈计算result30add出栈return 30将结果传给main的sumadd栈帧弹出main出栈程序结束递归方法调用自身的写法须满足两个条件有递归出口终止条件每次递归调用问题规模缩小public static int factorial(int n) { if (n 1) return 1; // 递归出口 return n * factorial(n - 1); // 问题规模缩小 }递归层级过深会导致栈帧无限堆积抛出StackOverflowError。基本类型与引用类型对比维度基本类型8种引用类型存储内容数据值本身堆中对象的地址内存位置栈方法栈帧引用在栈对象在堆默认值对应类型的零值int为 0boolean为falsenull赋值/传参复制值互不影响复制地址修改内容相互影响是否可为null否是Java 的 8 种基本类型分类类型占用取值范围整数byte1B-128 ~ 127short2B-32768 ~ 32767int4B-2³¹ ~ 2³¹-1long8B-2⁶³ ~ 2⁶³-1浮点float4B精度 6~7 位double8B精度 15~16 位字符char2B0 ~ 65535布尔booleanJVM 实现相关true/false注意事项方法不能嵌套定义Java 不允许在一个方法体内定义另一个方法return执行后方法立即结束其后代码不会执行编译可通过但不可达声明了非void返回值类型的方法所有执行路径都必须有return语句调用方法时实参的类型、数量、顺序必须与形参一致引用类型变量值为null时调用方法或访问属性会抛出NullPointerException