文章目录

  • 🚀一、方法
  • 🔎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中方法的调用过程如下:

  1. 在主程序中调用方法。
  2. JVM(Java虚拟机)在调用方法前,首先会在内存中查找该方法的字节码文件,如果该文件不存在,则会去classpath中寻找该文件,如果还是找不到,则会抛出异常。
  3. 找到方法的字节码文件后,JVM会在内存中为该方法创建一个栈帧(Stack Frame),栈帧中存储了方法的参数、局部变量、运行状态等信息。
  4. JVM将程序计数器(Program Counter)指向该方法的字节码指令数组的第一条指令。
  5. JVM开始按照指令数组中的顺序执行方法的指令,直至遇到return语句或抛出异常。
  6. 如果该方法返回值,则该值会被压入调用栈中的栈帧中。
  7. 如果该方法调用了其他方法,则JVM会将其他方法的栈帧压入调用栈中,等待执行。
  8. 当该方法执行完毕后,JVM会将该方法的栈帧出栈,程序计数器指向方法调用返回地址的指令。
  9. 如果该方法调用了其他方法,则JVM会从调用栈中弹出其他方法的栈帧,继续执行。
  10. 当所有方法都执行完毕后,程序退出。

🦋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 带参数方法定义和调用

  1. 定义带参数方法:
public static void methodName(paramType paramName) {
    // 方法体
}

其中,paramType为参数类型,paramName为参数名。

  1. 调用带参数方法:
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中带返回值的方法定义和调用可以按照以下步骤进行操作:

  1. 定义带有返回值的方法,在方法名之后加上返回值类型,如下面的例子所示:
public int add(int a, int b) {
    int sum = a + b;
    return sum;
}

在上面的例子中,返回值类型为int,表示该方法将返回一个整数类型的结果。

  1. 在方法体中添加需要执行的代码,完成相应的计算或操作。
  2. 在方法的最后,使用return语句返回方法结果,如上面的例子中的return sum语句。
  3. 调用带有返回值的方法时,将方法返回值存储在变量中,如下面的例子所示:
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 中的方法重载是指在同一个类中,一个方法名可以被定义多次,但是参数列表必须不同。具体来说,方法的重载可以包括以下几种情况:

  1. 参数个数不同;
  2. 参数类型不同;
  3. 参数顺序不同。

例如,下面的代码演示了方法的重载:

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 方法内部修改了数组的值之后,再打印出原始数组,发现原始数组的值也被修改了。

这种特性在实际编程中非常有用,因为它允许我们在方法内部修改对象的状态,而不需要返回新的对象。这样可以避免额外的内存分配和资源浪费,提高程序的性能和效率。