【Java方法笔记】3-1 方法:定义与调用
§3-1 方法
从开始学习 Java 以来,我们接触得最多的就是public static void main(String[] args) {}
,这是main
方法。那么,何谓方法?方法有何用?如何编写方法,又如何使用方法?这是本章将要解决的问题。
第一讲,先从方法本身的定义以及方法的定义和调用开始。
3-1.1 何谓方法?
Java 方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题地步骤的有序组合;
- 方法包含于类或对象中;
- 方法在程序中被创建,在其他地方被引用。
在先前章节中,我们经常使用System.out.println()
,这句语句的意思是:调用在System
类中的out
输出对象的println()
方法。而该方法被定义在 Java 内,可见,方法在程序中被创建,在其他地方被引用。
设计方法的原则:一个方法只完成一个功能,保持方法的原子性。
3-1.2 方法的定义与调用
Java 的方法类似于其他语言的函数,是一段用于完成特定功能的代码片段,一般情况下,一个方法包含以下语法:
方法:包含一个方法头和一个方法体。
-
修饰符:可选。用于告诉编译器如何调用该方法,定义了该方法的访问类型;
-
返回值类型:方法可能会返回值。
returnValueType
是方法返回值的数据类型。有些方法执行所需操作,但没有返回值,此时returnValueType
的关键字为void
; -
方法名:方法的实际名称,方法名和参数表共同构成方法签名。命名规范遵循首字母小写 + 驼峰原则;
-
参数类型:参数像是个占位符(placeholder)。方法被调用时,传递值给参数,这个值称为实际参数(实参)或变量。参数列表是指方法的参数类型、顺序和参数个数。可选,方法可不包含任何参数。
- 形式参数(形参):方法被调用时用于接收外界输入的数据;
- 实参:调用方法时实际传给方法的数据
-
方法体:包含具体的语句,定义该方法的功能。
创建一个方法,语法:
修饰符 返回值类型 方法名(参数类型 参数名) {
方法体;
return 返回值;
}
调用一个方法,语法:
对象名.方法名(实参列表)
- 当方法返回一个值时,方法调用常被当做一个值,可以利用表达式调用。如:
int larger = max(30,40);
- 若方法返回值为
void
,方法调用只能为一条语句,为语句调用。如:System.out.println("这是条语句。");
我们来尝试写两个方法,并调用它们:
方法 I:加法运算
public class Demo01 {
//main 方法:方法名前的为方法的返回值类型,void 不返回值
public static void main(String[] args) {
//调用 add 方法
//实际参数:实际调用传递的参数
int sum = add(1, 2);
//输出结果
System.out.println(sum);
}
//自定义:add 方法
//形式参数:勇于接受外界数据
public static int add(int a, int b) {
return a+b;
}
}
运行结果如图所示:
方法 II:比大小
public class Demo02 {
public static void main(String[] args) {
//比大小(整型),调用方法:当做一个值
int a = compare(2,2);
int b = compare(1,2);
int c = compare(2,1);
//输出
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
public static int compare(int a, int b) {
int result = -1;
if (a == b) {
System.out.println("Equal");
return 0; //终止方法
}
if (a < b) {
result = b;
} else {
result = a;
}
//返回值必须写在方法体最后
return result;
}
}
运行结果如图所示:
方法调用的大致过程:值得注意的是,方法在调用时,被调用方法会被压入栈中,同时保存调用方法的运行状态和返回地址,直至被调用方法执行完毕后,方法出栈,归还堆栈空间并根据返回地址向调用函数返回返回值。Java 的这种调用机制被称为栈机制。
3-1.3 拓展:值传递与引用传递
Java 中的方法类似于 C++ 的函数,在调用方法时,通常需要考虑调用方法、参数传递、返回值类型。不同于C++有多种函数传参方式,在 Java 中,只有值传递。
值传递:在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。在传递参数时,实际参数的内容将会被赋值给被调用方法的形式参数中,为形式参数开辟一定的内存空间,方法体中所有的语句,都是针对形式参数的修改和访问。当方法执行完毕后,所开辟的内存空间将会被回收,并且方法将会通过一个匿名对象返回return
后方的表达式。Java 只使用值传递。
引用传递:在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。