方法概述
概念:方法(method)就是一段具有独立功能的代码块,需要手动调用才能执行
作用:可以提高代码的复用性和可阅读性,但是不会提高运行效率。
方法必须先创建才可以使用,该过程称为方法定义
方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
方法的定义和调用
定义格式:
public static void 方法名 ( ) {
// 方法体;
}
调用格式:
方法名();
方法必须先定义,后调用,否则程序将报错
方法调用内存图
方法在没有被调用的时候,都在方法区中字节码文件(.class)中存储
方法在被调用的时候,要进入到栈内存中才能运行
案例
需求:设计一个方法method,方法中定义一个变量(数值随意) 判断这个变量是奇数还是偶
数,并在main方法中调用method。
思路:
①:定义方法,名称为method
②:方法中定义变量,使用if语句判断是奇数还是偶数
③:main方法中调用method方法
public static void method() {
int num = 10;
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
}
public static void main(String[] args) {
method();
}
带参数方法的定义和调用
定义格式:
public static void 方法名 (参数列表) {
方法体;
}
参数列表可以由1到多个参数组成,多个参数之间使用,分割
参数由数据类型和变量名组成: 数据类型 变量名 eg:int a
方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
调用格式:
方法名(参数);
方法名(参数1,参数2);
方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
形参和实参
形参:全称形式参数,是指方法定义时的参数,用来接收方法调用时的参数。
格式:方法名(形参类型1 形参变量名1, 形参类型2 形参变量名2)
实参:全称实际参数,方法调用中的参数,该参数的值传递给形式参数后参与方法中代码的运算
格式:方法名(实参变量名1,实参变量名2)或者(实参常量1,实参常量2)
形参和实参的关系
参数名称:没有关系
实参的变量名和形参的变量名没有关系,可以完全不一样
分别是两个或两组不同的参数,仅仅在在调用时,将实参变量的值赋值给形参变量
当参数为引用数据类型时
把实参变量的值赋值给形参变量,赋的值其实就是引用类型对象在堆内存中的地址值
形参和实参指向了堆内存中同一地址值,通过任意一个参数修改其值,另外一个参数的值的具体内容会同步发生改变
练习
需求:设计一个方法(print) 用于打印 n 到 m 之间所有的奇数
思路:
①:定义方法,名称为print
②:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
③:方法中设计for循环,循环从n开始,到m结束
④:循环中加入if判断,是奇数,则打印
⑤:main方法中调用print方法,传入两个实际参数
代码
package com.itheima.method2;
public class Demo2Method {
public static void main(String[] args) {
// 5:main方法中调用print方法,传入两个实际参数
print(20,10);
}
//1:定义方法,名称为print
// 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
public static void print(int n, int m){
System.out.println(n + "到" + m + "之间的奇数为:");
// 3:方法中设计for循环,循环从n开始,到m结束
for(int i = 20; i <= 10; i++){
// 4:循环中加入if判断,是奇数,则打印
if(i % 2 == 1){
System.out.println(i);
}
}
}
}
带返回值方法的定义和调用
定义格式
public static 数据类型 方法名 ( 参数 ) {
return 数据 ;
}
方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
调用格式
方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;
方法的返回值通常会使用变量接收,否则该返回值将无意义
练习
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
思路
1. 定义一个方法,声明两个形参接收计算的数值,求出结果并返回
2. 使用 if 语句 得出 a 和 b 之间的最大值,根据情况return具体结果
3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
代码
public class Demo2Method {
/*
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
1. 定义一个方法,声明两个形参接收计算的数值,求出结果并返回
2. 使用 if 语句 得出 a 和 b 之间的最大值,根据情况return具体结果
3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
*/
public static void main(String[] args) {
// 3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
System.out.println(getMax(10, 20)); // 输出调用
int result = getMax(10, 20);
System.out.println(result);
for (int i = 1; i <= result; i++) {
System.out.println("HelloWorld");
}
}
// 方法可以获取两个数的较大值
public static int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
}
方法定义和使用汇总
方法的通用格式
public static 返回值类型 方法名(参数列表) {
方法体;
return 数据 ;
}
public static 返回值类型 方法名(int num1, int num2, double num3){}
public static:修饰符,目前先记住这个格式
返回值类型:方法操作完毕之后返回的数据的数据类型
方法名:标识符,通过方法名调用该方法
参数列表:方法的代码运行前 , 所需要的材料
方法体:依业务而定,就是方法运行的主体
return作用
1. 用于结束方法
2. 如果有的话,用于将数据返还给调用者.
放在一起统称方法签名
方法必须先定义再使用
按照方法要求的格式,在类中其他方法外完成方法签名和方法体的编写,这个过程称为方法的定义
根据需求在指定位置使用上述定义好的方法的过程称为方法的调用
方法的编写顺序和执行顺序无关,和调用顺序一致。
将代码抽取到方法中,可以提高代码的复用性和可阅读性,但是不会提高代码执行效率
方法定义时的注意事项
方法签名
方法签名包括方法名和参数列表,不包括返回值返回值类型及修饰符
两个方法的方法签名一致:方法名和参数列表完全一致
参数列表一致:参数类型、参数个数、参数顺序完全一致才行,但是与参数名称无关
public static int getSum(int a, int b, double c){
return 10;
} - getMax(1,2,3.0)
public static void getSum(int num1, int num2, double num3){} - getMax(1,2,3.0)
public static void getSum(int num1, double num3, int num2){} - getMax(1,3.0,2)
这两个方法签名不一致,因为参数顺序不一样,这个有可能是重载,之后会讲
这两个方法签名一致,与形参名无关
定义方法时,要做到两个明确
明确参数列表:分析方法运行之前是否需要不能百分百明确的材料, 要什么类型的, 要几个?
明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
方法不能嵌套定义
只能定在类里面,其他方法外面
方法不可以嵌套定义,但是可嵌套调用
main(){
int max = getMax()
sout(max)
}
getMax(){
int num = getScannerNum();
int num2 = getScannerNum();
// 比较大小
}
getScannerNum(){
//创建一个键盘录入的对象
// 开启通道获取键盘录入的数据
// 把录入的数据返回
}
返回值和返回值类型
方法的返回值最多只能有一个
1. 如果方法没有返回值
方法签名中返回值类型需要写void
方法体中可以不写return
方法体中可以写return,但是要这样写 return;
2. 如果方法有一个返回值
方法签名中返回值类型不能写void
方法签名中返回值类型要与方法体中return语句返回的数值类型一致
方法体中必须通过return的方式返回指定类型的值,否则会报错
是否有return语句的标准:从语法的角度校验是否有最少有一个return语句会被执行
3. 如果方法有多个返回值
一个方法不可以返回多个返回值
可以使用数组等容器将多个数据封装到一个容器中返回
public static int getSum(int a, int b, double c){
return 10;
} - getMax(1,2,3.0)
public static int[] getSum(int a, int b, double c){
int[] arr1 = new int[3]
int[] arr2 = new int[3]
// 一顿操作
int[][] arrDouble = new int[2][];
arrDouble[0] = arr1;
arrDouble[1] = arr2;
return arrDouble;
} - getMax(1,2,3.0)
return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
语法逻辑上,一定不会被执行的return后面,不能再写其他代码
但是,如果某个return语句不一定会被执行,后面是可以写其他语句的。
一个方法中,可以有多个return语句,但是只会执行其中一个
因为只要执行了任何一个,当前方法就结束了。
如果写了多个return语句,从语法的角度来说必须要有一个return语句能够被执行,否则会报错
int getMax(){
if(a > b){
return a;
}else if(a<=b){
return b;
}else{ //这块代码不能省
return b;
}
}
方法调用时的注意事项
方法调用时传递的参数需要完全符合方法定义时的参数列表要求
调用格式1:方法名(与参数列表匹配的变量/常量);
无返回值的方法,直接调用即可,而且是唯一的可用的调用方式
有返回值的方法可以这样调用,但是不建议。因为无法获取返回值
调用格式2:赋值调用
数据类型 变量名 = 方法名(与参数列表匹配的变量/常量);
调用格式3:输出调用
System.out.println(方法名(与参数列表匹配的变量/常量));
调用格式4:传参调用
作为实参传递进其他的方法列表中
System.out.println(方法名(与参数列表匹配的变量/常量));
System.out.println(getMax(a,b));
System.out.println(b);
这些调用方式仅适用于有返回值的方法