方法

方法调用

方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。

当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。

定义格式:

1
2
3
4
修饰符 返回值类型 方法名 (参数列表){
代码...
return ;

定义格式解释:

  • 修饰符:目前固定写法 public static 。
  • 返回值类型:目前固定写法 void ,其他返回值类型在后面的课程讲解。
  • 方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法。
  • 参数列表: 方法在运算过程中的未知数据,调用者调用方法时传递
  • return:方法结束。因为返回值类型是void,方法大括号内的return可以不写。

方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。

在主方法中,直接写要调用的方法名字就可以调用了。

1
2
3
4
5
6
7
8
public static void main(String[] args) {
method method();//调用定义的方法
}

//定义方法,被main方法调用
public static void method() {
System.out.println("自己定义的方法,需要被main调用运行");
}
image-20240223231436070

方法重载

  • 方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关
  • 参数列表:个数不同,数据类型不同,顺序不同
  • 重载方法调用:JVM通过方法的参数列表,调用不同的方法

方法重写/覆盖(override)

方法覆盖(重写)就是子类有一个方法,和父类的某个方参数一样,那么我们就说子类的这个方法

法的名称、返回类型、覆盖了父类的方法

重载与重写的区别

重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。

区别点 重载方法 重写方法
发生范围 同一个类 子类
参数列表 必须修改 一定不能修改
返回类型 可修改 子类方法返回值类型应比父类方法返回值类型更小或相等
异常 可修改 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
访问修饰符 可修改 一定不能做更严格的限制(可以降低限制),范围可以更大
发生阶段 编译期 运行期

方法的重写要遵循“两同两小一大”

  • “两同”即方法名相同、形参列表相同;
  • “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • “一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。

关于重写的返回值类型,如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。

总结:

  • 重载是在同一个类中定义多个同名方法,参数列表不同。
  • 重写是子类重新定义父类已经存在的方法,方法签名必须相同。
  • 重载是在编译时发生的,而重写是在运行时发生的。
  • 重载不涉及继承,而重写涉及子类覆盖父类的方法。

可变长参数

从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。就比如下面的这个 printVariable 方法就可以接受 0 个或者多个参数。

1
2
3
public static void method1(String... args) {
//......
}

另外,可变参数只能作为函数的最后一个参数,但其前面可以有也可以没有任何其他参数。

1
2
3
public static void method2(String arg1, String... args) {
//......
}

遇到方法重载的情况怎么办呢?会优先匹配固定参数还是可变参数的方法呢?

答案是会优先匹配固定参数的方法,因为固定参数的方法匹配度更高。

我们通过下面这个例子来证明一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 微信搜 JavaGuide 回复"面试突击"即可免费领取个人原创的 Java 面试手册
*
* @author Guide哥
* @date 2021/12/13 16:52
**/
public class VariableLengthArgument {

public static void printVariable(String... args) {
for (String s : args) {
System.out.println(s);
}
}

public static void printVariable(String arg1, String arg2) {
System.out.println(arg1 + arg2);
}

public static void main(String[] args) {
printVariable("a", "b");
printVariable("a", "b", "c", "d");
}
}

输出:

1
2
3
4
5
ab
a
b
c
d

方法
http://example.com/2023/05/13/Java/Java基础/方法/
作者
PALE13
发布于
2023年5月13日
许可协议