Java 方法:定义、分类、传值、可变参数与方法重载
在 Java 编程中,方法是实现代码复用和模块化的重要工具。本文将详细介绍 Java 方法的定义、分类、传值方式、可变参数以及方法重载等关键知识点。
1. 方法的定义
在 Java 中,定义一个方法的基本语法如下:
访问修饰符 返回类型 方法名(参数列表) {
若干语句;
return 方法返回值;
}
- 访问修饰符:有
public
、private
、protected
以及省略(default
)四种情况。在基础学习阶段,我们统一使用public
修饰方法。 - 返回类型:可以是任何数据类型,若方法无返回值,则设置为
void
。 - 方法名:命名规范和变量相同。
- 参数列表:参数是变量的一种,其作用域在方法内部。
- 方法体:包含方法内部的具体语句。当返回值为
void
时,return
语句可省略。
2. 方法的分类
根据方法是否带有参数、是否有返回值,Java 方法可分为以下四类:
2.1 无参无返回值方法
此类方法参数列表为空,返回值为 void
。例如,将输出语句封装到方法中:
class MethodDemo1 {
// 定义无参无返回值方法
public void printText() {
// 三条输出语句
System.out.println("你好新同学");
System.out.println("Java是就业前景最好的语言");
System.out.println("学Java就来");
}
public static void main(String[] args) {
// 实例化MethodDemo1类
MethodDemo1 methodDemo1 = new MethodDemo1();
// 调用printText方法
methodDemo1.printText();
}
}
运行结果:
你好新同学
Java是就业前景最好的语言
学Java就来
对于非静态方法,需使用 new
关键字实例化类,再通过 对象名.方法名()
的方式调用。
2.2 无参带返回值方法
参数列表为空,返回值不为 void
,方法体内部需使用 return
语句返回声明的返回类型。示例如下:
class MethodDemo2 {
// 定义无参带返回值方法
public String getHelloStr() {
// 初始化变量str
String str = "Hello World";
// 返回str
return str;
}
public static void main(String[] args) {
// 实例化MethodDemo2
MethodDemo2 methodDemo2 = new MethodDemo2();
// 调用getStr方法,并且使用result变量接收返回值
String result = methodDemo2.getHelloStr();
// 打印返回值
System.out.println(result);
}
}
运行结果:
Hello World
2.3 带参数无返回值方法
带有参数列表,返回值为 void
。参数列表可能有一个或多个参数,多个参数用逗号 (,
) 隔开。示例:
class MethodDemo3 {
// 定义带参数无返回值方法
public void printArea(float a, float b) { // 此处的 a,b 为参数变量
float result = a * b;
System.out.println( "长方形面积为:" + result);
}
public static void main(String[] args) {
// 实例化MethodDemo3
MethodDemo3 methodDemo3 = new MethodDemo3();
// 初始化两个变量
float width = 12.3f;
float height = 20f;
// 调用printArea方法,并将 width、height变量作为参数传入
methodDemo3.printArea(width, height);
// 也可不提前初始化变量,直接传入浮点型字面量作为参数。
methodDemo3.printArea(10.2f, 2.5f);
}
}
运行结果:
长方形面积为:246.0
长方形面积为:25.5
调用带参数方法时,有两种传参方式:先初始化变量再传递,或直接传入对应类型字面量。
2.4 带参数带返回值方法
带有参数列表,返回值不为 void
。例如求从 1 到 n 的平方和:
class MethodDemo4 {
// 定义带参数带返回值方法
public int getSumOfSquares(int n) {
int sum = 0;
for (int i = 1; i <=n; i++) {
// 求i的平方,并加和赋值给sum
sum += i * i;
}
// 返回计算结果
return sum;
}
public static void main(String[] args) {
// 实例化MethodDemo4
MethodDemo4 methodDemo4 = new MethodDemo4();
// 调用对象下getSumOfSquares方法,并用sumOfSquares变量接收返回结果
int sumOfSquares = methodDemo4.getSumOfSquares(5);
System.out.println("1到5的累加平方和为:" + sumOfSquares);
}
}
运行结果:
1到5的累加平方和为:55
也可直接打印方法调用语句,不定义变量接收返回结果。
当参数为数组时,示例如下:
class MethodDemo5 {
/**
* 查找数组中元素是否包含指定元素
* @param arr 待查找数组
* @param element 所查找的元素
* @return boolean 查找结果,true包含; false不包含
*/
public boolean contains(int[] arr, int element) {
// 定义返回结果,默认为false,即未找到element元素
boolean result = false;
for (int value : arr) {
if (value == element) {
// 找到了element元素,将变量更新为true,并跳出循环
result = true;
break;
}
}
// 返回计算结果
return result;
}
public static void main(String[] args) {
// 实例化MethodDemo5
MethodDemo5 methodDemo5 = new MethodDemo5();
// 初始化一个数组
int[] intArray = {1, 3, 5, 6, 7, 9};
// 初始化待查找元素变量
int element = 10;
// 调用contains方法,并接收返回结果
boolean contains = methodDemo5.contains(intArray, element);
// 根据返回结果,输出内容
if (contains) {
System.out.println("数组intArray中包含元素" + element);
} else {
System.out.println("数组intArray中不包含元素" + element);
}
}
}
运行结果:
数组intArray中不包含元素10
3. 方法传值
调用方和方法之间有参数传递时,需注意方法传值问题。
3.1 基本类型的传值
基本类型参数的传递是调用方值的复制,双方各自的后续修改互不影响。示例:
class Car {
public void speedUp(int speed) {
System.out.println("小汽车加速前,速度为:" + speed);
speed ++;
System.out.println("小汽车加速后,速度为:" + speed);
}
public static void main(String[] args) {
// 定义小汽车初始速度变量
int speed = 10;
// 实例化Car类,创建一个car对象
Car car = new Car();
// 调用car对象下的speed方法
car.speedUp(speed);
// 打印调用方法后速度参数的值
System.out.println("调用speedUp方法后,调用方的speed参数为:" + speed);
}
}
运行结果:
小汽车加速前,速度为:10
小汽车加速后,速度为:11
调用speedUp方法后,调用方的speed参数为:10
3.2 引用类型的传值
引用类型参数的传递,调用方的变量和接收方的参数变量地址指向同一个对象,双方任意一方对对象的修改都会影响对方。示例:
class NBATeam {
// 替换第一个球员方法
public void replaceFirstPlayer(String[] players, String playerName) {
// 替换第一个球员
System.out.println("将第一个球员替换:");
players[0] = playerName;
}
public static void main(String[] args) {
String[] players = {"詹姆斯", "科比", "杜兰特", "乔丹"};
System.out.println("球队中现有球员:");
for (String player : players) {
System.out.print(player + "\t");
}
System.out.println();
// 创建team对象并调用其替换球员方法
NBATeam team = new NBATeam();
team.replaceFirstPlayer(players, "皮蓬");
System.out.println("替换后球员:");
for (String player : players) {
System.out.print(player + "\t");
}
}
}
运行结果:
球队中现有球员:
詹姆斯 科比 杜兰特 乔丹
将第一个球员替换:
替换后球员:
皮蓬 科比 杜兰特 乔丹
4. 可变参数
可以使用可变参数列表声明方法的参数,语法为:参数类型... 参数名
。示例:
class VariableParameter {
public void sum(int... n) {
int sum = 0;
// 可以对可变参数进行迭代
for (int i: n) {
sum = sum + i;
}
System.out.println("sum=" + sum);
}
public static void main(String[] args) {
// 创建对象
VariableParameter variableParameter = new VariableParameter();
// 调用方法,传递一个参数
variableParameter.sum(1);
// 调用方法,传递两个参数
variableParameter.sum(2, 3);
// 调用方法,传递三个参数
variableParameter.sum(5, 6, 7);
}
}
运行结果:
sum=1
sum=5
sum=18
当方法的参数列表有两个或两个以上参数时,可变参数一定要放在最后。也可以将数组传递给可变参数列表:
public class VariableParameter1 {
public void search(int element, int... elements) {
boolean existed = false;
for (int e: elements) {
if (e == element) {
existed = true;
break;
}
}
if (existed) {
System.out.println("找到元素:" + element);
} else {
System.out.println("未找到元素:" + element);
}
}
public static void main(String[] args) {
// 创建对象
VariableParameter1 obj = new VariableParameter1();
// 调用方法
obj.search(2, 1,2,3,4);
// 定义数组参数
int[] arr = {1,2,3,4};
// 将数组传递给可变参数列表
obj.search(2, arr);
}
}
运行结果:
找到元素:2
找到元素:2
5. 方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数类型或参数个数。调用重载方法时,Java 编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
5.1 自定义方法的重载
例如,在 Student
类中定义多个 study
方法:
public class Student {
public void study() {
System.out.println("同学真好学!");
}
public void study(String name) {
System.out.println(name + "同学真好学!");
}
public void study(String name, int age) {
System.out.println(name + "同学真好学!" + "他今年" + age + "岁了");
}
public static void main(String[] args) {
// 实例化学生对象
Student student = new Student();
// 调用无参数方法
student.study();
// 调用单参数方法
student.study("Colorful");
// 调用双参数方法
student.study("小慕", 20);
}
}
运行结果:
同学真好学!
Colorful同学真好学!
小慕同学真好学!他今年20岁了
判断一个方法是否是重载方法的原则是:方法名相同,参数类型或参数个数不同。
5.2 JDK 中的方法重载
Java 语言本身的类也定义了很多方法重载的例子,例如 String
类的 substring
方法:
public String substring(int beginIndex); // 截取并返回从 beginIndex 位置到结束位置的字符串
public String substring(int beginIndex, int endIndex); // 截取并返回从beginIndex位置到endIndex-1位置的字符串
实际应用实例:
String hello = "Hello, ";
String substring1 = hello.substring(7);
String substring2 = hello.substring(0, 5);
System.out.println(substring1);
System.out.println(substring2);
运行结果:
Hello
通过以上内容,我们全面了解了 Java 方法的定义、分类、传值方式、可变参数以及方法重载等重要知识点,这些知识将有助于我们编写更加高效、灵活的 Java 代码。