java方法

117 阅读5分钟

方法

概念

方法是完成特定功能的、相对独立的程序段。

方法一旦定义,就可以在不同的程序中多次调用,因此 方法可以增强程序结构的清晰度,提高编程效率。

方法可分为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:

  1. 方法设计原则:一个方法只能做一件事
  2. 方法不能嵌套,不能再一个方法中声明另外一个方法。
  3. Java编程语言中,main()方法是程序的入口点(entry point),是一个特殊的方法,Java虚拟机(JVM)将这个方法开始执行程序。且其必须是静态的(static),因为JVM在执行main()方法之前没有创建任何对象实例。
  4. 修饰符:
    1. 访问修饰符:用于控制程序元素的访问权限,包括publicprotectedprivate和默认(不写任何修饰符)四种
      • public表示公共的,可以被任何类访问;
      • protected表示受保护的,只能被本类、同一包中的类以及子类访问;
      • private表示私有的,只能被本类访问;
      • 默认修饰符表示包访问权限,只能被统一报中的类访问。
    2. 非访问修饰符:用于控制程序元素的行为,包括staticfinalabstractsynchronizedvolatile
      • static表示静态的,可以被类直接调用,也可以用于定义类变量和类方法。
      • final表示不可改变的,可以用于定义常量、禁止继承类和禁止重写方法。
      • abstract表示抽象的,用于抽象类和抽象方法,不能被实例化。
      • syschronized表示同步的,用于实现线程同步。
      • volatile表示易变的,用于标记变量为线程共享变量,保证可变性和有序性。
    3. 其他修饰符:包括transientnativestrictfp等。
      • 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);
    }
}
可变长度参数和数组的区别
  1. 数组作为参数必须要传值,可变长度参数不一定
  2. 可变长度参数只能用于参数列表最后一个参数位置
  3. 可变长度参数只能在数列表出现,数组可以定义局部变量
  4. 参数列表只有数组和可变产单独参数不同时,才是重载

方法的作用域和生命周期

  1. 方法的形参是方法内的局部变量

  2. 作用域:方法内的局部变量只能在方法内部使用,方法外部超出了方法变量的

作用域,不能使用

  1. 生命周期:方法内的局部变量在方法调用时申请内存,在方法调用结束后回收

方法变量的内存