目录
本文内容是对方法的梳理和总结,本文内容包括:
一、方法的声明与格式
在java 中方法声明的语法规则如下:
[修饰符] 返回值类型 方法名([参表]{ //方法体 }
1.方法声明包括方法头和方法体两部分。
其中方法头确定方法的名称、 形式参数的语法解析:名称和类型、返回值的类型和访问限制。
方法体是一段代码块,用于执行方法的具体操作。方法的局部变量和语句都定义在方法体内部。
2.Java 中常用的修饰符包括以下几种:
访问修饰符: 用于控制程序元素的访问权限,包括 public、protected、private 和默认(不写任何修饰符) 四种。 非访问修饰符:用于控制程序元素的行为,包括 static、final、abstract、synchronized、volatile 等
其他修饰符:包括 transient、native、strictfp 等
在Java 中,一个程序元素可以同时拥有多个修饰符,它们的顺序可以任意排列。例如一个方法可以同时使用 public、static、final、synchronized 等多个修饰符来限定它的访问权限、行为和线程安全性。
3.返回值类型反映方法完成其功能后返回的运算结果的数据类型。如果方法没有返回值,使用 void 关键字声明。 4.方法名称要符合标识符命名规则,不要与 Java 中的关键字重名
5.参数表指定在调用该方法时,应该传递的参数的个数和数据类型。参数表中可以包含多个参数,相邻的两
个参数之间用逗号隔开。方法也可以没有参数,称为无参方法。
6.对于有返回值的方法,其方法体中至少有一条 return 语句,形式如下:
return 表达式;
当调用该方法时,方法的返回值就是 return 后面的表达式
7.return 返回值的类型必须与方法声明的返回值类型一致
8.方法不能嵌套,不能在一个方法中声明另外一个方法。
二、方法的调用
-
方法设计原则:一个方法只做一件事,例如menu()方法只显示菜单,如果有多件事要做,就设计多个方法
-
主调方法:发出调用的方法
-
被调方法:被调用的方法
-
强调:被调方法执行过程中,主调方法处于阻塞状态,当被调方法执行结束后,程序执行返回到主调方法,主调方法停止阻塞,继续执行
// 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("-------------------------------------------"); }
三、方法的形参与实参
需求:完成用户登录功能
设计login()方法,传入参数用户名和密码,显示登录结果(正确的用户名和密码: admin , P@$$w0rd ) 在main()方法中,从键盘输入用户名和密码,调用login()方法验证用户名和密码 是否正确,输出验证结果 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("登录失败"); } }
小结
-
方法参数传递规则:按照类型、个数、顺序一致原则传递参数
-
实参与形参:主调方法的实参传递给被调用方法的形参
-
对参数的理解:被调方法运行前,需要从主调方法得到的数据,是方法运行的前提条件
四、方法的可变数
方法的可变参数是指:方法参数的个数可变
可变参数的标志是三个点
可变参数必须是方法的最后一个参数
可变参数实际上是一个数组
可以向可变参数传入数组和或者散列值
需求:某公司有多个部门,每个部门人数不同,每个人的工资不同,如下: 开发部:李逵:1987,鲁智深:2001,燕青:2005 测试部:扈三娘:2009,孙二娘:1888 现要求设计一个方法,传入部门名称和每个员工的工资,在方法内显示部门的平均工资。 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.可变参数的定义 1.可变参数必须是方法的最后一个参数
2.一个方法只能有一个可变参数
3.可变参数实际上是一个数组
3.可变参数的调用
1.实参可用是数组
2.实参可用是散列值
3.实参可用是null
五、方法返回值
需求:实现用户登录
1. 设计login()方法,传入参数用户名和密码,返回布尔值 返回true,用户名密码正确 返回false,用户名或密码错误 正确的用户名和密码: admin , P@$$w0rd 2. 在main()方法中,从键盘输入用户名和密码,调用login()方法验证用户名和密码 是否正确,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(); // 调用login方法,result接收方法返回值 boolean result = login(username, password); System.out.println(result ? "登录成功" : "登录失败"); } // 方法返回布尔值 public static boolean login(String username, String password) { return "admin".equals(username) && "123".equals(password)? true:false; }
小结
1.被调方法返回值
方法运行后输出的运行结果
一个方法只能返回一个值
使用return语句返回值
return 返回值的类型必须与方法声明返回值的类型一致如果方法声明了返回值,那么方法就必须返回值2.主调方法接收返回值 主调方法使用 = 运算符接收方法返回值
六、方法-变量作用域和生命周期
需求:读程序,说出运行结果,分析原因
小结
\1. 方法的形参是方法内的局部变量
\2. 作用域:方法内的局部变量只能在方法内部使用,方法外部超出了方法变量的
作用域,不能使用
\3. 生命周期:方法内的局部变量在方法调用时申请内存,在方法调用结束后回收
方法变量的内存
public static void main(String[] args) { int age = 18; System.out.println("main()方法调用前:age = " + age); increment(age); System.out.println("main()方法调用后:age = " + age); } public static void increment(int age) { System.out.println("increment()方法中自增前:age = " + age); age++; System.out.println("increment()方法中自增后:age = " + age); }