方法
概念
方法是完成特定功能的、相对独立的程序段。
方法一旦定义,就可以在不同的程序中多次调用,因此 方法可以增强程序结构的清晰度,提高编程效率。
方法可分为
JDK提供的方法(称为API,即应用程序接口)和开发人员自定义的方法。
方法的声明
语法规则如下:
[修饰符] 返回值类型 方法名称([参数表]){
//方法体
}
定义示例:
// menu是被调方法
public static void menu() {
System.out.println("-------------- 欢迎使用订餐系统 --------
------");
System.out.println("-------------- 1:我要注册 --------
------");
System.out.println("-------------- 2:我要登录 --------
------");
System.out.println("-------------- 3、我要退出 --------
------");
System.out.println("-------------------------------------
------");
}
tips:
- 方法设计原则:一个方法只能做一件事
- 方法不能嵌套,不能再一个方法中声明另外一个方法。
- 再
Java编程语言中,main()方法是程序的入口点(entry point),是一个特殊的方法,Java虚拟机(JVM)将这个方法开始执行程序。且其必须是静态的(static),因为JVM在执行main()方法之前没有创建任何对象实例。 - 修饰符:
- 访问修饰符:用于控制程序元素的访问权限,包括
public、protected、private和默认(不写任何修饰符)四种public表示公共的,可以被任何类访问;protected表示受保护的,只能被本类、同一包中的类以及子类访问;private表示私有的,只能被本类访问;- 默认修饰符表示包访问权限,只能被统一报中的类访问。
- 非访问修饰符:用于控制程序元素的行为,包括
static、final、abstract、synchronized、volatile等static表示静态的,可以被类直接调用,也可以用于定义类变量和类方法。final表示不可改变的,可以用于定义常量、禁止继承类和禁止重写方法。abstract表示抽象的,用于抽象类和抽象方法,不能被实例化。syschronized表示同步的,用于实现线程同步。volatile表示易变的,用于标记变量为线程共享变量,保证可变性和有序性。
- 其他修饰符:包括
transient、native、strictfp等。transient表示短暂的,用于标记变量不参与序列化。native表示本地的,用于标记方法是本地方法(由本地代码实现)。strictfp表示严格的浮点计算,用于保证浮点计算机结果的可移植性和精度。
- 访问修饰符:用于控制程序元素的访问权限,包括
方法的使用
方法的调用
调用方法,即执行该方法,发出调用的方法称为主调方法,被调用的方法称为被调方法。
被调方法执行过程中,主调方法处于阻塞状态,当被调用方法执行结束后,程序执行返回到主调方法,主调方法停止阻塞,继续执行
// main是主调方法
public static void main(String[] args) {
menu();
}
// menu是被调方法
public static void menu() {
System.out.println("-------------- 欢迎使用订餐系统 --------------");
System.out.println("-------------- 1:我要注册 --------------");
System.out.println("-------------- 2:我要登录 --------------");
System.out.println("-------------- 3、我要退出 --------------");
System.out.println("-------------------------------------------");
}
方法的返回值
被调方法通过return 语句将数据返回给主调方法,一个方法只能返回一个数据给主调方法。return语句后面的返回值必须与方法声明的返回值类型一致。
方法的参数
被调方法中的参数称为形式参数,主调方法中的参数称为实际参数。
当主调方法调用被调方法时,是将主调方法的实际参数传递给被调参数的形式参数。形式参数与实际参数必须在个数、类型、顺序上一致。
形参和实参
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
// username, password 是实际参数
login(username, password);
}
// username,password是形式参数
public static void login(String username, String password) {
if ("admin".equals(username) && "123".equals(password)) {
System.out.println("登录成功");
} else {
System.out.println("登录失败");
}
}
}
可变长度参数
方法的可变参数是指:方法参数的个数可变
- 可变参数的标志是三个点
- 可变参数必须是方法的最后一个参数
- 可变参数实际上是一个数组
- 可以向可变参数传入数组和或者散列值
public class Main {
public static void main(String[] args) {
// 调用showSalary方法,给可变参数传入散列值
showSalary("开发部", 1987, 2001, 2005);
// 调用showSalary方法,给可变参数传入数组
showSalary("测试部", new double[]{2009, 1888});
}
// salary定义为可变参数
public static void showSalary(String dname, double... salary) {
double sum = 0;
if (salary != null && salary.length > 0) {
for (int i = 0; i < salary.length; i++) {
sum += salary[i];
}
}
System.out.printf("%s部门的平均薪资是%.2f", dname, sum /
salary.length);
}
}
可变长度参数和数组的区别
- 数组作为参数必须要传值,可变长度参数不一定
- 可变长度参数只能用于参数列表最后一个参数位置
- 可变长度参数只能在数列表出现,数组可以定义局部变量
- 参数列表只有数组和可变产单独参数不同时,才是重载
方法的作用域和生命周期
-
方法的形参是方法内的局部变量
-
作用域:方法内的局部变量只能在方法内部使用,方法外部超出了方法变量的
作用域,不能使用
- 生命周期:方法内的局部变量在方法调用时申请内存,在方法调用结束后回收
方法变量的内存