一、简介
在 Java 中,方法指的是解决一类问题的代码的集合,这样可以提高代码的复用性,增强程序的可读性和可理解性,另外,在 C/C++ 语言中,方法也叫函数,这两个指的是一个东西。
二、方法的定义
语法结构
修饰符 返回值类型 方法名(参数列表) {
方法体
}
- 修饰符:可以是访问控制符、静态修饰符等,用于控制方法的访问权限和特性;
- 返回值类型:指定了方法执行完毕后返回的值的类型,如果方法没有返回值,则返回值类型为 void;
- 方法名:是标识符,用于标识方法;
- 参数列表:是方法接收的输入参数,可以有零个或多个参数,每个参数包括参数类型和参数名;
- 方法体:是实现方法功能的代码块。
public int add(int a, int b) {
return a + b;
}
这个方法名为 add,接受两个整数参数 a 和 b,返回它们的和。
三、方法的调用
通过方法名和参数列表来调用方法,执行方法中的代码。当调用一个有返回值的方法时,可以将方法的返回值赋给一个变量或者在表达式中使用;对于没有返回值的方法,直接调用即可。
public class Main {
public static void main(String[] args) {
// 调用方法
int sum = add(5, 20);
System.out.println("两数之和:" + sum);
}
// 定义方法
public static int add(int a, int b) {
return a + b;
}
}
运行结果:
两数之和:25
四、可变长参数
可变参数是一种特殊类型的方法参数,允许你在调用方法时传递任意数量的参数给该方法,可变参数在方法声明中用省略号 (…) 表示,紧跟在参数类型的后面,如果还有其他方法参数,那么可变参数要放在最后,值得注意的是,可变长参数的底层是由数组实现的,所以可以通过下标来访问元素。
public class Main {
public static void main(String[] args) {
int[] nums = {1, 5, 7, 2, 9};
// 调用方法
System.out.println("数组的最大值是:" + printMax(nums));
}
// 求一个数组的最大值
public static int printMax(int... nums) {
// 判断数组是否为空
if (nums.length == 0) return -1;
// 创建临时数组,用来存放数组的最大值
int temp = nums[0];
// 通过循环得到最大值
for (int i = 1; i < nums.length; i++) {
if (nums[i] > temp) {
temp = nums[i];
}
}
return temp;
}
}
运行结果:
数组的最大值是:9
五、静态方法为什么不能调非静态成员
静态方法是属于类的而不是对象,在类加载的时候就会分配内存,可以直接通过类名访问。
而非静态成员(变量和方法)属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
由于在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,如果调用的话,编译器会报错。
六、方法的重载和重写
方法的重载
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理,发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
方法的重载发生在编译期,编译器会根据方法签名来具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如果编译器找不到匹配的参数, 则在编译期报错。
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
方法的重写
方法的重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。
⚠️对于方法的重写需要注意以下几点:
- 构造方法无法被重写。
- 方法名、参数列表必须相同,子类比父类的返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
- 如果父类方法访问修饰符为 private、final、static 则子类就不能重写该方法,但是被 static 修饰的方法能够被再次声明。
总结
区别 | 重载 | 重写 |
---|---|---|
范围 | 同类 | 子类 |
发生阶段 | 编译期 | 运行期 |
参数 | 必须不一样 | 不能发生改变 |
返回类型 | 可以修改 | 子类比父类的返回值类型更小或相等 |
异常 | 可以修改 | 子类比父类抛出的异常更小或相等 |
修饰符 | 可以修改 | 不能比父类的修饰符更加严格 |