文章目录
- 🚀一、方法
- 🔎1. 方法概述
- 🦋1.1 方法的概念
- 🔎2. 方法的定义和调用
- 🦋2.1 无参数方法定义和调用
- 🦋2.2 方法的调用过程
- 🦋2.3 方法练习-奇偶数判断
- 🔎3. 带参数方法的定义和调用
- 🦋3.1 带参数方法定义和调用
- 🦋3.2 形参和实参
- 🔎4. 带返回值方法的定义和调用
- 🦋4.1 带返回值方法定义和调用
- 🔎5. 方法的注意事项
- 🦋5.1 方法的通用格式
- 🦋5.2 方法的注意事项
- 🔎6. 方法重载
- 🔎7. 方法的参数传递
- 🦋7.1 方法参数传递基本类型
- 🦋7.2 方法参数传递引用类型
- 🚀感谢:给读者的一封信
🚀一、方法
🔎1. 方法概述
🦋1.1 方法的概念
在Java中,方法指的是一段可执行的代码块,它能够完成特定的功能。方法可以理解为对象中的函数或子例程,它们通常用于执行一些特定的任务,比如输出一段文本、计算数字、修改对象的属性等。方法通常有输入参数和返回值,但也可以没有参数和返回值。
在Java中,一个方法可以定义在一个类中,或者在一个接口中。一个方法的定义包括方法名、参数列表、返回值类型、访问修饰符和方法体。方法名用于唯一标识一个方法,参数列表则是指向该方法传递的参数,返回值类型表示该方法返回的数据类型,访问修饰符用于控制方法的访问范围,方法体则包含了该方法要执行的代码逻辑。
Java中的方法允许方法重载,即在同一个类中可以定义多个方法,它们的方法名相同,但参数列表不同。这样做的好处是可以让一个方法名代表不同的功能,提高代码的可重用性和可读性。
🔎2. 方法的定义和调用
🦋2.1 无参数方法定义和调用
无参数方法定义:
public void methodName() {
// 方法体
}
无参数方法调用:
methodName();
其中,void
表示该方法没有返回值。
🦋2.2 方法的调用过程
Java中方法的调用过程如下:
- 在主程序中调用方法。
- JVM(Java虚拟机)在调用方法前,首先会在内存中查找该方法的字节码文件,如果该文件不存在,则会去classpath中寻找该文件,如果还是找不到,则会抛出异常。
- 找到方法的字节码文件后,JVM会在内存中为该方法创建一个栈帧(Stack Frame),栈帧中存储了方法的参数、局部变量、运行状态等信息。
- JVM将程序计数器(Program Counter)指向该方法的字节码指令数组的第一条指令。
- JVM开始按照指令数组中的顺序执行方法的指令,直至遇到return语句或抛出异常。
- 如果该方法返回值,则该值会被压入调用栈中的栈帧中。
- 如果该方法调用了其他方法,则JVM会将其他方法的栈帧压入调用栈中,等待执行。
- 当该方法执行完毕后,JVM会将该方法的栈帧出栈,程序计数器指向方法调用返回地址的指令。
- 如果该方法调用了其他方法,则JVM会从调用栈中弹出其他方法的栈帧,继续执行。
- 当所有方法都执行完毕后,程序退出。
🦋2.3 方法练习-奇偶数判断
- 需求:判断一个数是奇数还是偶数
- 代码:
public class Demo1Method {
/*
带参数方法的定义格式:
public static void 方法名 ( 参数 ) { … … }
public static void 方法名 ( 数据类型 变量名 ) { … … }
带参数方法的调用格式:
方法名 ( 参数 ) ;
方法名 ( 变量名/常量值 ) ;
tips: 参数可以是一个, 也可以是多个.
需求: 判断一个数是奇数还是偶数
*/
public static void main(String[] args) {
isEvenNumber(10);
}
public static void isEvenNumber(int num){
if(num % 2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
}
🔎3. 带参数方法的定义和调用
🦋3.1 带参数方法定义和调用
- 定义带参数方法:
public static void methodName(paramType paramName) {
// 方法体
}
其中,paramType为参数类型,paramName为参数名。
- 调用带参数方法:
methodName(paramValue);
其中,paramValue为传递给方法的参数值。
举例说明:
public class Test {
public static void main(String[] args) {
String name = "Tom";
int age = 25;
sayHello(name, age); // 调用带参数的方法
}
public static void sayHello(String name, int age) { // 带参数的方法
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
}
输出结果为:
Hello, my name is Tom and I am 25 years old.
🦋3.2 形参和实参
在 Java 中,方法的参数分为形参和实参。
形参是在定义方法时所列出的参数列表,是方法中的一个变量,用来接收调用该方法时传入的值,形参的数据类型和数量是由方法定义者指定的。
实参是在调用方法时传入的参数,是实际被传递的值,它们的数据类型必须与方法中所声明的形参的数据类型相匹配,数量也必须相等。在调用方法时,实参传递给形参,方法使用这些实参执行特定的操作。
例如,下面的代码定义了一个有两个形参的方法:
public void add(int a, int b) {
int sum = a + b;
System.out.println("两数之和为:" + sum);
}
在调用这个方法时,需要传入两个整数作为实参:
add(2, 3);
在这个例子中,参数列表中包含两个形参 a 和 b,实参列表中包含两个整数 2 和 3,方法将这两个实参相加并输出结果。
🔎4. 带返回值方法的定义和调用
🦋4.1 带返回值方法定义和调用
Java中带返回值的方法定义和调用可以按照以下步骤进行操作:
- 定义带有返回值的方法,在方法名之后加上返回值类型,如下面的例子所示:
public int add(int a, int b) {
int sum = a + b;
return sum;
}
在上面的例子中,返回值类型为int,表示该方法将返回一个整数类型的结果。
- 在方法体中添加需要执行的代码,完成相应的计算或操作。
- 在方法的最后,使用return语句返回方法结果,如上面的例子中的return sum语句。
- 调用带有返回值的方法时,将方法返回值存储在变量中,如下面的例子所示:
int result = add(1, 2);
在上面的例子中,将1和2作为参数传递给add方法,并且将返回值存储在result变量中。
注意:调用带有返回值的方法时,必须使用变量保存返回值,否则返回值会丢失。如果方法返回值类型为void,则不需要使用变量保存返回值。
🔎5. 方法的注意事项
🦋5.1 方法的通用格式
Java 中方法的通用格式如下:
访问修饰符 返回类型 方法名(参数类型 参数名, ...) {
// 方法体
return 返回值;
}
其中,
- 访问修饰符:表示方法的访问权限,可以是 public、protected、private 或默认(不写)。
- 返回类型:表示方法返回的数据类型,如果方法不返回任何值,则返回类型为
void
。 - 方法名:表示方法的名字,用来唯一地标识方法。
- 参数类型:表示方法的参数类型,可以有多个参数,每个参数类型均用逗号隔开。
- 参数名:表示方法的参数名,用来在方法体中引用参数值。
- 方法体:表示方法的具体实现,包括操作数据、控制流程等等。
- 返回值:表示方法返回的值,返回类型为
void
时不需要返回值,否则需要使用return
语句返回一个对应类型的值。
🦋5.2 方法的注意事项
- 方法不能嵌套定义
- 示例代码:
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodOne() {
public static void methodTwo() {
// 这里会引发编译错误!!!
}
}
}
- void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
- 示例代码:
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodTwo() {
//return 100; 编译错误,因为没有具体返回值类型
return;
//System.out.println(100); return语句后面不能跟数据或代码
}
}
🔎6. 方法重载
Java 中的方法重载是指在同一个类中,一个方法名可以被定义多次,但是参数列表必须不同。具体来说,方法的重载可以包括以下几种情况:
- 参数个数不同;
- 参数类型不同;
- 参数顺序不同。
例如,下面的代码演示了方法的重载:
public class Example {
public void print() {
System.out.println("Hello, world!");
}
public void print(String str) {
System.out.println("Hello, " + str + "!");
}
public void print(int num) {
System.out.println("Hello, " + num + "!");
}
public static void main(String[] args) {
Example example = new Example();
example.print(); // 输出:Hello, world!
example.print("Java"); // 输出:Hello, Java!
example.print(123); // 输出:Hello, 123!
}
}
在上面的例子中,Example
类中定义了三个同名的 print()
方法,但是它们的参数列表都不同。在 main()
方法中分别调用这三个方法,可以看到它们都能够正确地执行,说明 Java 支持方法的重载。
🔎7. 方法的参数传递
🦋7.1 方法参数传递基本类型
Java中方法参数传递基本类型时,是按值传递的。这意味着在调用方法时,实参的值会被复制到形参中,方法中对形参的修改不会影响实参的值。
例如:
public class Main {
public static void main(String[] args) {
int x = 5;
modify(x);
System.out.println(x); // 输出结果为 5,因为 x 的值没有被修改
}
public static void modify(int num) {
num = 10;
}
}
在上述代码中,modify
方法接收一个 int
型参数 num
,并把它修改为 10。但在 main
方法中调用 modify
方法时,传递给它的是 x
的副本,即 num
的值是 5,因此 x
的值没有被修改。
需要注意的是,在方法中对引用类型的实参进行修改时,会影响到实参的值。这是因为引用类型的实参传递的是其内存地址,而不是实际的对象。
🦋7.2 方法参数传递引用类型
在 Java 中,方法参数可以是基本类型或引用类型。当方法参数是基本类型时,传递的是值拷贝,也就是说方法内部对参数的修改不会影响到原始值。而当方法参数是引用类型时,传递的是引用拷贝,也就是说方法内部对参数的修改会直接影响到原始值。
具体来说,如果方法参数是一个引用类型,而在方法内部修改了该引用指向的对象的状态,那么原始值也会受到影响。例如:
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
modifyArray(arr);
System.out.println(Arrays.toString(arr)); // [2, 3, 4]
}
public static void modifyArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] += 1;
}
}
}
在上面的代码中,modifyArray
方法接受一个 int
类型的数组作为参数,用一个循环将数组中的每个元素加 1。在 main
方法中先创建了一个数组 [1, 2, 3]
,然后调用 modifyArray
方法,将该数组传递给了 modifyArray
方法。在 modifyArray
方法内部修改了数组的值之后,再打印出原始数组,发现原始数组的值也被修改了。
这种特性在实际编程中非常有用,因为它允许我们在方法内部修改对象的状态,而不需要返回新的对象。这样可以避免额外的内存分配和资源浪费,提高程序的性能和效率。