(1)方法是完成特定功能的、相对独立的程序段,与其他编程语言中的子程序、函数等概念想当。
(2)方法一旦定义,就可以在不同的程序段中多次调用,故方法可以增强程序结构的清晰度,提高编程效率。
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 中,一个程序元素可以同时拥有多个修饰符,它们的顺序可以任意排列。
例如,一个方法可以同时使用 public、static、final、synchronized 等多个修饰符来限定它的访问权限、行为和线程安全性。
(3)返回值类型反映方法完成其功能后返回的运算结果的数据类型。如果方法没有返回值,使用
void
关键字声明。
(4)方法名称要符合标识命名规则,不得与 Java 关键字重名。
(5)参数指定在调用方法时,应该传递的参数的个数和数据类型。参数表中可以包含多个参数,相邻的两个参数之间用逗号隔开。方法也可以没有参数,称为无参方法。
(6)对于有返回值的方法,其中方法体中至少有一条
return
语句。
(7)
return
返回值类型必须与方法声明的返回值类型一致。
(8)方法不能嵌套,不能在一个方法中声明另一个方法。
在 Java 中,main() 方法是程序的入口点(entery point),是一个特殊方法,Java 虚拟机(JVM)将从这个方法开始执行程序。main() 方法必须是静态的(static),因为 JVM 在执行 main() 方法之前没有创建任何对象实例
调用方法,即执行方法。发出调用的方法称为主调方法,被调用的方法称为被调方法。
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);
}
}
被调方法通过
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;
}
}
如果方法定义中有参数,那么调用方法时,一定要满足参数定义才能调用。
被调用参数称为形式参数,主调方法中的参数被称为实际参数。当主调方法调用被调方法时,是将主调方法的实际参数传递给被调方法的形式参数。形式参数与实际参数必须在个数、类型、顺序上一致。
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]
在 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,以及可以接受任意数量参数的方法。