- 👑专栏内容:Java
- ⛪个人主页:子夜的星的主页
- 💕座右铭:前路未远,步履不停
目录
- 一、方法的概念
- 1、什么是方法?
- 2、方法的定义
- 3、方法调用的过程
- 二、方法重载
- 1、重载的概念
- 2、方法签名
在日常生活中,如果做饭,我们会用到菜刀。如果砍树,我们会用到斧头。而菜刀、斧头这种工具都是在做好后可以重复使用的。类似于生活中的工具,我们在日常生活中会使用各种各样的工具来完成不同的任务一样,在Java中也我们也可以将需要重复使用的操作写成一个方法,便于后面重复使用。好了,让我们一起揭开方法神秘的面纱。
一、方法的概念
1、什么是方法?
方法就是一个代码片段。类似于 C 语言中的 “函数”。方法允许我们将代码进行组织和封装,这有助于提高代码的可读性、可重用性和可维护性。方法可以接受参数,执行一系列操作,并返回一个结果。
方法存在的意义:
-
是能够模块化的组织代码(当代码规模比较复杂的时候)
-
做到代码被重复使用, 一份代码可以在多个位置使用
-
让代码更好理解更简单
-
直接调用现有方法开发, 不必重复造轮子
那我们举个简单的例子,我先写一个简单的方法。
public static void roastInOven(String name){System.out.println("烤"+name);}
这个方法是一个烤箱方法,他的作用是在你输出的字前面加个烤字。
可以简单的类比为,我这个方法就是现实中的烤箱,可以把任何东西烤熟。
2、方法的定义
public static void roastInOven(String name){System.out.println("烤"+name);}
我们来拆解一下这个方法。
public
:这是访问修饰符,表示该方法是公共的,可以被其他类访问。在Java中,"public"表示该方法对所有类都是可见的。
static
:这是一个关键字,表示该方法是一个静态方法。静态方法属于类而不是对象,可以通过类名直接调用,而不需要先创建类的实例。在这里,roastInOven 是一个静态方法。
void
:这是方法的返回类型。"void"表示该方法没有返回值。在这个例子中,方法执行后只是打印一条消息,而没有产生具体的返回值。
roastInOven
:这是方法的名称。它是一个标识符,用于在程序中引用该方法。
(String name)
:这是方法的参数列表。在括号中指定了一个参数,这里是一个字符串类型的参数,命名为 name。方法可以接受输入的数据,并在方法体内使用。
System.out.println("烤"+name);
这是方法体,包含这个方法内要执行的语句。
通过这个事例,我们可以总结出一个方法是如何定义的了。
修饰符 返回值类型 方法名称(方法参数列表) {方法体,包含实现特定任务的代码
}
根据这个,我们来模仿着写一个方法。该方法的作用是将输入的两个数相加。
public static int add(int a, int b) {int y = a + b;return y;
}
【注意事项】
-
修饰符:现阶段直接使用
public static
固定搭配 -
返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成
void
-
方法名字:采用小驼峰命名
-
参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
-
在java当中,方法必须写在类当中
-
在java当中,方法不能嵌套定义
-
在java当中,没有方法声明一说(C语言需要进行方法声明)
3、方法调用的过程
方法的调用过程为:调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法往下执行
public static int add(int x, int y) {System.out.println("调用方法中 x = " + x + " y = " + y);return x + y;}public static void main(String[] args) {int x = 10;int y = 20;System.out.println("第一次调用方法之前");int sum = add(x, y);System.out.println("第一次调用方法之后");System.out.println("sum = " + sum);System.out.println("第二次调用方法之前");sum = add(30, 50);System.out.println("第二次调用方法之后");System.out.println("sum = " + sum);}
为什么会这样? 因为方法的调用,每次都会在栈上开辟内存!
栈帧,也称为帧或活动记录,是在程序执行时存储有关方法调用和本地变量的数据结构。每当调用一个方法时,Java 虚拟机都会为该方法创建一个栈帧,它会被推入 Java 虚拟机的调用栈。
栈帧的创建和销毁遵循方法调用和返回的过程。当一个方法被调用时,一个新的栈帧被创建并推入调用栈的顶部。当方法执行完毕时,栈帧被弹出,控制流回到调用该方法的地方,同时销毁了该栈帧。
二、方法重载
1、重载的概念
方法重载是指在一个类中定义多个同名的方法。在生活中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。比如,有个人对你说,你是一个好人。这个时候,好人就有多种意思。一种是你真的是一个好人,第二种意思就是别人在委婉的拒绝你。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。在Java中,一个类中定义了多个同名的方法,就会构成重载。前段时间写过一个C++里面的函数重载博客,看这个费劲的可以看看:C++ 函数重载:女友说的话到底是什么意思?
public static int add(int x, int y) {return x + y;}public static double add(double x, double y) {return x + y;}public static double add(double x, double y, double z) {return x + y + z;}public static void main(String[] args) {System.out.println(add(1, 2)); // 调用add(int, int)System.out.println(add(1.5, 2.5)); // 调用add(double, double)System.out.println(add(1.5, 2.5, 3.5));// 调用add(double, double, double)}
【注意】
-
方法名必须相同
-
参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
-
与返回值类型是否相同无关
-
两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
-
编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法
2、方法签名
是的!在方法中不能定义两个名字一样的变量,因为在同一个作用域中不能定义两个相同名称的标识符。那为什么类中就可以定义方法名相同的方法呢?
因为编译器在解析方法重载时主要依赖于方法签名的唯一性。方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
将Java代码经过编译之后,可以使用JDK自带的javap
反汇编工具查看:
反汇编查看之后,可以发现,两个方法的名字都叫add
,但是在编译器上的名字其实并不一样。
方法全路径名+参数列表+返回值类型
,这才是每一个方法真正的名字。
下面解释一下方法签名中的一些特殊符号说明:
特殊字符 | 数据类型 |
---|---|
V | void |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
[ | 数组 |
L | 引用类型,以L开头,以;结尾,中间是引用类型的全类名 |
今天就先聊到这里了,希望看完这篇文章,你能学会方法。我们下次再见!