✨hello,愿意点进来的小伙伴们,你们好呐!✨
🐻🐻系列专栏:【JavaSE】
🐲🐲本篇内容:Java方法的介绍
🐯🐯作者简介:一名大一即将升大二的三非编程小白
JavaSE之方法
1. 方法的概念和使用
我们知道在C语言有一种经常使用的语法叫函数,而在Java也有这种“函数”,不过在Java中,它被称为方法。
1.1 定义方法的意义
1. 定义方法可以将代码模块化(当代码规模比较复杂的时候),要使用直接调用即可。
2. 在代码重复使用的时候,可以将代码封装成方法,一个方法可以在多个位置使用。
3. 让代码更好理解。
4. 直接调用现有的方法开发,可以不必重复造轮子。
1.2 方法的定义
修饰符 返回类型 方法名 (形参列表){
方法体
}
public static int test(int a){
return a;
}
🐹🐹注解:
public : 限制了该方法的使用范围。
static :表示该方法是静态的。
int : 表示该方法体必须有返回值,返回值类型为:int。
test : 是该方法的方法名,用方法名调用该方法。
(int a):说明在调用该方法的时候要给他传入参数,参数类型为:int
a : 是在外部传入该方法中可以使用形式参数。
return a : 返回值 a。
1.2.1 方法定义注意细节:
1. 在java当中,方法必须写在类当中。
2. 在java当中,方法不能嵌套定义。
3. 在java当中,没有方法声明一说。
4. 如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void。
5. 方法名字:采用小驼峰命名。
6. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开。
1.3方法调用
public static int Add(int a, int b,int c){
return a + b + c;
}
public static void main9(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println(Add(a,b,c));
}
Add(a,b,c)
就是方法的调用:方法名(参数)
在参数列表中传入的参数类型和个数要和方法定义形参列表的参数数量,类型,顺序一样
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行。
- 一个方法可以被多次调用。
1.3.1 方法调用后执行过程
调用方法 —> 传递参数 —> 找到方法地址 —> 执行被调方法的方法体—> 被调方法结束返回 —> 回到主调方法继续往下执行
1.4 实参和形参的关系
在Java中,实参的值永远是拷贝到形参中的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。比如:
Add(a,b,c)
:这里面的 a b c 是实参,在方法中用
(int a, int b,int c)
来接收从方法调用传过来的 a b c,这里面的 a b c 就是形参,只是实参的一份拷贝,形参改变不会影响实参的值。
形参和实参本质是两个实体
🐻🐻下面有一个例子:
- 在方法中交换 a 与 b 的值并不会让 a 和 b 真正的交换。
- 在Java中并没有C语言的指针,所以想交换比较麻烦。
🐮🐮解决方法:
- 在Java中,数据是存放在栈上面的,因此想交换a 和 b要提高 new 或者数组。
1.5 方法的重载
1.5.1 为什么需要方法重载
🐷🐷引入:
我们想求三个数的最大值:
public static double Add1(double a , double b, double c){
double max = a > b ? a : b;
return max > c ? max : c;
}
public static void main10(String[] args) {
int a = 10;
int b = 20;
int c = 30;
Add1(a,b,c);
}
编译错误:不兼容的类型 …
🐗🐗1. 由于参数不符合,所以不能直接用现有的Add方法,在没有接触方法重载的我们,自然 “暴力求解”:
public static double Add2(int a , int b, int c){
double max = a > b ? a : b;
return max > c ? max : c;
}
🐴🐴2.然后这样子会导致方法名过于多与相似,不能体现Java的强大。
我们会想那能否将所有的名字都给成 add1 呢?
1.5.2 方法重载的概念
在自然语言中,经常会出现“一词多义”的现象,比如:“好人”。
在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。
🐑🐑在上诉问题可以改进为:
public static double Add1(double a , double b, double c ){
double max = a > b ? a : b;
return max > c ? max : c;
}
public static int Add1(int a, int b,int c){
int max = a > b ? a : b;
return max > c ? max : c;
}
public static void main10(String[] args) {
int a = 10;
int b = 20;
int c = 30;
Add1(a,b,c);
}
这样子改进后,减少了方法名的数量,且能让我们不用痛苦于取名字的循环中。
🐍🐍方法重载的细节:
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
1.5.3 方法签名
🐼🐼那大多数人又会想到一个问题:
这样子重载后,在Java底层是怎么识别它是该用哪种类型的方法的呢?
这就要引出一个方法签名的知识点。
方法签名要从Java的反汇编看得出,我们做了解就好,无需输入。
同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就
可以定义方法名相同的方法呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成
方法完整的名字。
public class TestMethod {
public static int add(int x, int y){
return x + y;
}
public static double add(double x, double y){
return x + y;
}
public static void main(String[] args) {
add(1,2);
add(1.5, 2.5);
}
}
🐝🐝上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:1. 先对工程进行编译生成.class字节码文件
2. 在控制台中进入到要查看的.class所在的目录
3. 输入:javap -v 字节码文件名字即可
🐛🐛方法签名中的一些特殊符号说明:
字符 数据类型
V void
Z boolean
B byte
C char
S short
I int
J long
F float
D double
- [
- 数组(以[开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组)
L 引用类型,以L开头,以;结尾,中间是引用类型的全类名