Java基础(十)方法

一、方法的理解


(1)方法是完成特定功能的、相对独立的程序段,与其他编程语言中的子程序、函数等概念想当。
(2)方法一旦定义,就可以在不同的程序段中多次调用,故方法可以增强程序结构的清晰度,提高编程效率。

1. 方法的声明

java 中方法声明的语法规则如下:

[修饰值] 返回值类型 方法名称( [参数表] ) {
	// 方法体
}

语法解析:

(1)方法声明包括方法头和方法体两部分。
其中方法头确定方法名称、形式参数的名称和类型、返回值的类型和访问权限限制。
方法体是一段代码块,用于执行方法的具体操作。方法的局部变量和语句都定义在方法体内部。

(2)在 java 中,修饰符(Modifier)是一种关键字,用于修饰类、方法、变量等各种元素的声明。java 中常用的修饰符包括以下几种:

修饰符 类成员 子类 其他类
public
protected × ×
默认(无修饰符) × ×
private × × × ×
static ×
final
abstract × × √(抽象方法) ×
synchronized × × × √(方法) ×
volatile × × × × ×
transient × ×(实例变量) × × ×
native × √(方法) × × ×
strictfp × √(类) × × ×
注解修饰符 √(注解) × × × ×

作用说明:

  • 访问控制修饰符用于控制类、变量、方法和构造函数的访问级别。
    • public:表示公共的,可以被任何类访问。
    • protected:表示受保护的,可以被同一包内的类和所有子类访问。
    • 默认(无修饰符):只能被同一包内的类访问。
    • private:表示私有的,只能被所属类访问。
  • 非访问控制修饰符提供其他功能,如控制类的继承性、创建单例模式等。
    • static:表示类的成员(方法、变量)属于类本身,而不是实例。也可以用于静态块。
    • final:表示类不可继承、方法不可重写、变量不可修改。
    • abstract:用于抽象类和抽象方法,抽象类不能被实例化,抽象方法只有声明没有实现。
  • 其他修饰符
    • synchronized:用于方法或代码块,用于实现线程同步,在多线程环境下保证共享资源的安全访问。
    • volatile:用于变量,表示该变量是易变的(Volatile Variable),即每次访问都强制从主内存中读取最新值,而不使用缓存,用于多线程环境下的变量可见性与顺序性问题。
    • transient:用于实例变量,表示该变量在序列化过程中会被忽略,不会被持久化保存。
    • native:用于方法,表示该方法是用非Java语言(如C、C++)实现的本地方法,需要通过JNI(Java Native Interface)进行调用。
    • strictfp:用于类和接口,表示使用严格的浮点计算规则,确保浮点计算在不同平台上的结果一致。
  • 注解修饰符用于为 Java 元素(类、方法、变量等)提供额外信息,用于编译器或其他工具的处理。
    • 注解修饰符可以通过自定义注解来扩展,并根据需要进行使用。

在 java 中,一个程序元素可以同时拥有多个修饰符,它们的顺序可以任意排列。
例如,一个方法可以同时使用 public、static、final、synchronized 等多个修饰符来限定它的访问权限、行为和线程安全性。

(3)返回值类型反映方法完成其功能后返回的运算结果的数据类型。如果方法没有返回值,使用 void 关键字声明。

(4)方法名称要符合标识命名规则,不得与 Java 关键字重名。

(5)参数指定在调用方法时,应该传递的参数的个数和数据类型。参数表中可以包含多个参数,相邻的两个参数之间用逗号隔开。方法也可以没有参数,称为无参方法。

(6)对于有返回值的方法,其中方法体中至少有一条 return 语句。

(7)return 返回值类型必须与方法声明的返回值类型一致。

(8)方法不能嵌套,不能在一个方法中声明另一个方法。

在 Java 中,main() 方法是程序的入口点(entery point),是一个特殊方法,Java 虚拟机(JVM)将从这个方法开始执行程序。main() 方法必须是静态的(static),因为 JVM 在执行 main() 方法之前没有创建任何对象实例

二、方法的调用


1. 方法的调用

调用方法,即执行方法。发出调用的方法称为主调方法,被调用的方法称为被调方法。

import java.util.Scanner;

public class Learn1101 {
    public static void main(String[] args) {
        // 重复调用方法求学生成绩平均成绩
        average();
        average();
        average();
    }
    public static void average() {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入 Java 成绩:");
        int java = input.nextInt();
        System.out.println("请输入 SQL 成绩:");
        int sql = input.nextInt();
        System.out.println("请输入 Oracle 成绩:");
        int oracle = input.nextInt();
        double result1 = (java + sql + oracle) * 1.0 / 3;
        System.out.println("该同学的平均成绩为" + result1);
    }
}

2. 方法的返回值

被调方法通过 return 语句将数据返回给主调方法,一个方法只能返回一个数据给主调方法。return 语句后面的返回值必须与方法声明的返回值类型一致。

public class Work1101 {
    public static void main(String[] args) {
        // 设计一个方法,用于计算整数的和
        System.out.println(sum(7, 6));
    }
    public static int sum(int a, int b) {
        return a + b;
    }
}

3. 返回值的参数

如果方法定义中有参数,那么调用方法时,一定要满足参数定义才能调用。

被调用参数称为形式参数,主调方法中的参数被称为实际参数。当主调方法调用被调方法时,是将主调方法的实际参数传递给被调方法的形式参数。形式参数与实际参数必须在个数、类型、顺序上一致。

import java.util.Arrays;

public class Work1106 {
    public static void main(String[] args) {
        // 交换元素位置
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        PositionExchange(arr,1,5);
        System.out.println(Arrays.toString(arr));
    }
    
    public static int[] PositionExchange(int[] arr, int begin, int end) {
        if (begin >=0 && begin < arr.length && end >=0 && end <arr.length) {
            int temp = arr[begin];
            arr[begin] = arr[end];
            arr[end] = temp;

            return arr;
        } else {
            return null;
        }
    }
}

// 输出:[1, 6, 3, 4, 5, 2, 7]

1. 可变长度参数

在 Java 中,可变长度参数,也称为可变参数或者不定参数,可以在方法声明中使用,用于接受不确定数量的参数。

使用可变长度参数时,需要在参数类型之后加上三个连续的点(...),表示这是一个可变长度参数。

在方法内部,可变长度参数会被当做一个数组处理,开发者可以像操作一个数组一样操作这个参数。
每个方法只能有一个可变参数,而且必须是最后一个参数

public class VariableParameters {
    // 可变参数示例
    public static void printNumbers(int... numbers) {
        for (int number : numbers) {
            System.out.print(number + " ");
        }
        System.out.println();
    }

    // 数组参数示例
    public static void printArray(int[] array) {
        for (int element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // 使用可变参数进行方法调用
        printNumbers(1, 2, 3, 4, 5); // 输出: 1 2 3 4 5
        printNumbers(); // 输出:

        // 使用数组进行方法调用
        int[] array = {1, 2, 3, 4, 5};
        printArray(array); // 输出: 1 2 3 4 5
    }
}

可变参数与数组的区别:

  • 可变参数在方法声明的参数列表中,而数组则是显式地传递给方法。
  • 可变参数允许方法调用者在调用方法时提供任意数量的参数,而数组需要事先创建并填充好数据。
  • 可变参数的长度是可变的,可以接受零个或多个参数,而数组的长度是固定的。

可变参数只能用于方法的最后一个位置,并且不能和数组作为参数的重载。在实际开发中,可变长度参数基础用于编写简化代码的 API,以及可以接受任意数量参数的方法。

你可能感兴趣的:(Java,java,开发语言)