从初学者到专家:Java方法的完整指南

目录

一.方法的概念及使用

1.1什么是方法

1.2方法的定义

1.3方法的调用

 1.4实参和形参的关系

1.5没有返回值的方法

1.6方法的意义 

二.方法重载

2.1方法重载的实现

2.2方法重载的意义

2.3方法签名


一.方法的概念及使用

1.1什么是方法

方法就是一个代码片段. 类似于 C 语言中的 "函数",来实现特定的功能,我们输入相关代码进去到方法中,让方法帮我们完成功能。其中涉及到方法的定义,调用,执行。

举几个简单的例子:

  1. 烹饪食物:将烹饪食物比作一个方法。你有一个菜谱(方法定义),其中包含了烹饪特定菜肴的步骤。当你想要做同样的菜肴时,你可以根据菜谱的指导(调用方法)来准备食材、进行烹饪,并最终获得可口的菜肴。

  2. 打电话:将打电话比作一个方法。当你想要与某人进行通话时,你需要输入对方的电话号码(方法参数),然后按下拨号键(调用方法)。电话网路会连接你和对方,你可以进行交流并传递信息。

  3. 洗衣服:将洗衣服比作一个方法。当你需要清洗衣物时,你将衣物放入洗衣机中(方法参数),选择适当的程序和洗涤剂(方法调用),然后启动洗衣机(执行方法)。最终,你将得到干净的衣物。

在这些例子中,方法提供了一种可重复使用的方式来执行特定的任务。它们接受输入(参数),执行一系列操作,并产生输出(结果)。这样的抽象使得我们可以更有效地组织和重用我们的行动,就像在编程中使用方法一样。


1.2方法的定义

方法的定义由以下几个组成部分:

  1. 访问修饰符(Access Modifier):用于控制其他类是否可以访问该方法。常见的访问修饰符包括public、private、protected和默认(不使用任何修饰符)。

  2. 返回类型(Return Type):指定方法执行完后返回的数据类型。如果方法不返回任何值,可以使用关键字void。

  3. 方法名称(Method Name):用于唯一标识方法的名称。方法名应该具有描述性,能够清晰地表达方法的功能。

  4. 参数列表(Parameter List):指定方法接受的输入参数。参数是方法执行所需的数据,可以有多个参数,并且每个参数都有其数据类型和名称。

  5. 方法体(Method Body):包含实际的代码块,定义了方法要执行的操作。方法体由一对花括号{}包围,其中包含了一系列的语句和逻辑。

  6. 返回语句(Return Statement):如果方法有返回类型,它可以使用return语句将结果返回给调用者。return语句也可以提前终止方法的执行。

在代码块实现是这样:

// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}

比如一个简单的代码:

public int Sum(int num1, int num2) {
        int sum = num1 + num2;
        return sum;
    }

在上述例子中,方法名为"Sum",返回类型为int(返回整数)。它有两个参数num1和num2,都是整数类型。方法体中的代码将num1和num2相加,将结果存储在sum变量中,并使用return语句返回sum的值。

注意事项:

1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有回值,必须写成 void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. 在java当中,方法不能嵌套定义
8. 在java当中,没有方法声明一说

1.3方法的调用

调用一个方法,你需要按照以下格式编写代码:

返回值类型 变量名 = 方法名(参数列表);

具体步骤如下:

  1. 使用方法的返回值类型声明一个变量,该变量将用于存储方法的返回结果。如果方法没有返回值(即返回类型为void),则不需要声明变量。

  2. 在等号左侧的变量名处,给变量取一个合适的名称,以便在后续的代码中引用该变量。

  3. 在等号右侧,写上要调用的方法名,并在括号内传递方法所需的参数。根据方法的定义,确保传递正确的参数类型和数量。

  4. 调用方法后,方法将执行其定义的操作,并返回一个结果(如果有返回值)。

简单的代码示例如下:求两数之和

// 定义一个名为Sum的方法,计算两个整数的和
public static int calculateSum(int num1, int num2) {
    int sum = num1 + num2;
    return sum;
}

// 在主程序中调用Sum方法
public static void main(String[] args) {
    int result = calculateSum(3, 5); // 调用calculateSum方法,并传入参数3和5
    System.out.println("Sum: " + result); // 打印结果:Sum: 8
}

输出代码如下: 

在上述示例中,我们定义了一个名为"calculateSum"的方法,用于计算两个整数的和。在主程序的main方法中,我们调用calculateSum方法,并传递参数3和5。方法执行后,返回结果8被赋值给result变量,并通过打印语句输出到控制台。 

 注意事项:

1.定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
2.一个方法可以被多次调用.

 1.4实参和形参的关系

在方法的定义和调用中,有两种类型的参数:形式参数(形参)和实际参数(实参)。

  1. 形式参数(形参)是在方法定义中声明的参数,用于接收方法调用时传递的值。形参相当于方法内部的局部变量,只在方法内部有效。形参在方法定义时指定其数据类型和名称。
  2. 实际参数(实参)是在方法调用时传递给方法的具体值或变量。实参是根据方法定义中形参的顺序进行传递的,并且必须与形参的类型相匹配。实参可以是常量、变量或表达式的值。
  3. 当方法被调用时,实参的值会被传递给对应的形参。这样,在方法内部,形参就可以使用传递进来的实参值进行操作。

举一个生活的例子理解:

假设你有一家制造汽车的工厂,你有一个汽车生产线,用于生产汽车。在这个例子中:

- 形式参数(形参):汽车设计图纸和规格说明书。设计图纸和规格说明书中包含了汽车的尺寸、配件要求和装配顺序等信息,相当于方法定义中声明的参数。这些信息并不是实际的汽车,只是用来描述要生产的汽车。

- 实际参数(实参):你根据设计图纸和规格说明书实际生产的汽车。这些实际的汽车是你根据设计图纸和规格说明书进行加工和装配的,相当于方法调用时传递给方法的具体值或变量。你根据设计图纸和规格说明书,使用零件和装配工具将汽车逐步加工和组装,最终得到实际的汽车。

当你将设计图纸和规格说明书交给工人时,他们会根据这些信息开始生产汽车。他们会根据设计图纸上的尺寸和配件要求,按照规定的装配顺序,使用实际的零件和工具进行加工和装配。在这个过程中,设计图纸和规格说明书充当了形参,而实际生产的汽车充当了实参。工人根据实际的设计图纸和规格说明书来进行加工和装配,最终生产出实际的汽车。

如下图:

 

还是举回上面的例子

// 定义一个名为Sum的方法,计算两个整数的和
public static int calculateSum(int num1, int num2) {
    int sum = num1 + num2;
    return sum;
}

// 在主程序中调用Sum方法
public static void main(String[] args) {
    int result = calculateSum(3, 5); // 调用calculateSum方法,并传入参数3和5
    System.out.println("Sum: " + result); // 打印结果:Sum: 8
}

 定义的calculatesSum方法中,num1 和num2是形参,主函数main中调用时存放的两个数字3,5就是实参。


实参的值永远都是拷贝到形参中,形参和实参本质是两个实体。

用一段代码解释 :交换两个整数

public class TestMethod {
public static void main(String[] args) {
    int a = 10;
    int b = 20;
    swap(a, b);
System.out.println("main: a = " + a + " b = " + b);
 }

public static void swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
    System.out.println("swap: x = " + x + " y = " + y);
   }
}
// 运行结果
swap: x = 20 y = 10
main: a = 10 b = 20
可以看到,在 swap 函数交换之后,形参 x y 的值发生了改变,但是 main 方法中 a b 还是交换之前的值,即没有交换成功。为什么呢?
因为  实参 a b main 方法中的两个变量,其空间在 main 方法的栈 ( 一块特殊的内存空间 ) 中,而形参 x y swap 方法中 的两个变量,x y 的空间在 swap 方法运行时的栈中,因此:实参 a b 与 形参 x y 是两个没有任何关联性的变量, swap 方法调用时,只是将实参 a b 中的值拷贝了一份传递给了形参 x y ,因此对形参 x y 操作不会对实参 a b 产生任何影响。

1.5没有返回值的方法

没有返回值的方法是指在方法定义中,方法声明的返回类型为`void`,表示该方法不返回任何值。

public void printMessage(String message) {
    System.out.println(message);
}

在上述示例中,`printMessage`是一个没有返回值的方法。它接受一个字符串形参“message”,并将该字符串打印到控制台上。

当调用没有返回值的方法时,方法内部执行相应的操作,但不会返回任何值给调用者。在上述例子中,当调用`printMessage`方法并传递一个字符串实参时,方法会打印该字符串,但不会返回任何结果。

没有返回值的方法通常用于执行某些操作或完成特定任务,而无需返回结果。例如,打印信息、更新数据、发送通知等。这样的方法对程序的执行起到了一种"副作用"的作用,即修改了程序状态或执行了特定的操作,但不产生可用于后续计算的返回值。

在调用没有返回值的方法时,通常仅关注方法执行的效果,而不需要接收方法的返回结果。

注意:

  1. 形参的名字可以随意取,对方法都没有任何影响
  2. 形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值
  3. Java 中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

1.6方法的意义 

1. 模块化和代码复用:方法将一系列相关的操作封装在一起,形成一个独立的模块。这有助于提高代码的可读性、可维护性和可重用性。

2. 抽象和封装:方法允许开发人员将程序的逻辑和实现细节隐藏在方法内部,只暴露必要的接口和功能给外部调用者。

3. 提高代码的可维护性和可读性:通过使用方法,将代码分解成多个小的、独立的功能块,使得代码更易于理解和维护。

4. 提高代码的灵活性和可扩展性:方法可以接受参数并返回结果,使得代码能够根据不同的输入产生不同的输出。

5. 实现面向对象的特性:方法是面向对象编程的基本构建块之一。通过方法,可以实现封装、继承和多态等面向对象的特性。

总之,方法在面向对象编程中具有重要的意义。它们帮助我们将代码组织成模块化、可维护和可复用的单元,提高了代码的可读性、可扩展性和可维护性。方法也是实现面向对象的特性的基础,使得我们能够更好地利用面向对象编程的优势。


二.方法重载

2.1方法重载的实现

 方法重载是指在同一个类中定义多个方法,它们具有相同的名称但拥有不同的参数列表。通过方法重载,可以根据不同的参数类型和数量来调用相应的方法,从而实现相似功能的多个方法。

举例代码如下:

public class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

在以上代码中, Calculator类定义了三个名为add的方法,它们具有相同的名称但参数列表不同。第一个add方法接收两个整数作为参数,并返回它们的和。第二个add方法接收两个双精度浮点数作为参数,并返回它们的和。第三个add方法接收三个整数作为参数,并返回它们的和。

通过方法重载,我们可以根据需要选择合适的方法来执行相加操作。例如:

Calculator calculator = new Calculator();
int result1 = calculator.add(2, 3);                  // 调用第一个add方法,返回5
double result2 = calculator.add(2.5, 3.5);           // 调用第二个add方法,返回6.0
int result3 = calculator.add(2, 3, 4);               // 调用第三个add方法,返回9

通过传递不同的参数类型和数量,我们可以正确地调用适合的方法,实现了根据不同参数进行加法操作的灵活性。

注意:

1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
// 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
public class TestMethod {
public static void main(String[] args) {
    int a = 10;
    int b = 20;
    int ret = add(a, b);
    System.out.println("ret = " + ret);
}

public static int add(int x, int y) {
      return x + y;
}

public static double add(int x, int y) {
     return x + y;
}
    }
// 编译出错
Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
public static double add(int x, int y) {
                ^
1 个错误


2.2方法重载的意义

  1. 提高代码可读性和可维护性

  2. 优化代码结构和设计

  3. 方便调用和使用

  4. 提高代码的兼容性

总之:方法重载在面向对象编程中具有重要的意义,它提供了更灵活、可读性更高、可维护性更好的代码编写方式,使得代码的设计和调用更加方便和易于理解。


2.3方法签名

我们知道,在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 字节码文件名字即可 

方法签名中的一些特殊符号说明:

 


好了,到这里就结束了,如果有什么错误的地方请在评论区指出,谢谢。

创作不易,如果可以的的话,请大家多三连支持一下下。虎杖悠仁同学会很赞同的。

猜你喜欢

转载自blog.csdn.net/LHY537200/article/details/132229070