方法(method)
一、方法概述
1.方法
1>什么是方法:
方法(method)是程序中最小的执行单元,是一段居于独立功能的代码块,不调用就不执行
2>为什么要有方法:
方法的出现,会提高打代码的复用性
3>方法使用提前须知
①方法必须先创建才可以使用,该过程为方法定义
②方法创建后并不是直接运行的,需要手动时使用后才执行,该过程称为调用
二、方法的定义和调用
1.方法的定义
1>格式:
public static void 方法名(){
//方法体;
}
2.方法的调用
1>调用的格式:
方法名();
注意:
①方法必须先定义后调用,否则程序将会报错
②方法与方法之间是平级关系,不能嵌套使用
③方法在任何位置调用,不一定要在main方法内
package com.test02_method;
//方法的创建和调用
/*
方法的定义格式:
public static void 方法名(){
方法体
}
方法的调用格式:
方法名();
方法与方法之间是平级关系,不能嵌套
*/
public class Demo01_method {
public static void main(String[] args) {
//方法的调用:
eat();
}
//方法的定义
public static void eat(){
study();
System.out.println("吃饭");
}
public static void study(){
System.out.println("学习");
}
}
package com.test02_method;
import java.util.Scanner;
//需求:定义方法,判断一个整数的奇偶性
//注意:方法需要先定义在调用,方法不会自动执行
public class Demo02_method_test01 {
public static void main(String[] args) {
//5.调用方法
panduan();
}
//1.定义方法:判断整数的奇偶性
public static void panduan(){
//1.创建键盘对象
Scanner sc = new Scanner(System.in);
//2.提示用户录入
System.out.println("请输入一个整数");
//3.接收录入数据
int num = sc.nextInt();
//4.判断录入数据的奇偶性
if(num % 2== 0){
System.out.println("这个数是偶数");
}else {
System.out.println("这个数是奇数");
}
}
}
三、带参数的方法的定义和调用
1.方法调用过程
1>方法没有被调用的时候,都在方法区的字节码文件(.class)中存储
2>方法被调用的时候,需要进入到栈内存中运行
2.为什么要有带参数方法
3.带参数方法定义
①格式:public static void 方法名 ( 参数 ) {方法体。。。}
②格式(单个参数):public static void 方法名 (数据类型 变量名 ) {方法体。。。}
示例(单个参数):public static void 方法名 ( int number) {方法体。。。}
③格式(多个参数):public static void 方法名 (数据类型 变量名1,数据类型 变量名1,… ) {…}
示例(多个参数):public static void 方法名 ( int number1,int number2,…) {方法体…}
④注意:
★方法定义时,参数中的数据类型与变量名都不能少,缺少任意一个程序将报错
★方法定义时,多个参数之间使用逗号(,)隔开
4.带参数方法调用:
1>格式:
方法名(参数);
①格式: 方法名 ( 参数 ) {方法体。。。}
**②格式(单个参数): 方法名 ( 变量名/常量值 ) **
示例(单个参数): method ( num/5)
**③格式(多个参数): 方法名 ( 变量名1/常量值1, 变量名2/常量值2,… ) **
**示例(多个参数): getmax ( num/5,sum/6…) **
2>注意:
方法调用时,参数的数量与类型必须要与方法中定义的设置相匹配,否则程序将报错
package com.test02_method;
import java.util.Scanner;
//需求:定义方法,判断一个整数的奇偶性
//注意:方法需要先定义在调用,方法不会自动执行
public class Demo03_method_test02 {
public static void main(String[] args) {
//1.创建键盘对象
Scanner sc = new Scanner(System.in);
//2.提示用户录入
System.out.println("请输入一个整数");
//3.接收录入数据
;
//5.调用方法
panduan(sc.nextInt());
}
//1.定义方法:判断整数的奇偶性
public static void panduan(int num){
//4.判断录入数据的奇偶性
if(num % 2== 0){
System.out.println("这个数是偶数");
}else {
System.out.println("这个数是奇数");
}
}
}
3>形参和实参
1>形参
概念:全称形式参数,是指方法定义中的参数
2>实参
概念:全称实际参数,是指方法调用中的参数
四、带返回值的方法的定义和调用
1.为什么要有带返回值的方法
我们经常会根据一个方法产生的结果,去组织另外一段代码逻辑
为了拿到这个方法产生的结果,就需要定义带有返回值的方法
2.格式:
1> 带返回值方法定义
public static 数据类型 方法名(参数){
方法体
return 数据;
}
示例:public static boolean isEvenNumber(int number){
方法体;
return true;
}
2>带返回值方法调用
格式1:方法名(参数);
示例: isEvenNumber(5);
格式2:数据类型 变量名 = 方法名 (参数);
示例:boolean flag = isEvenNumber(5);
3>注意:
方法定义时,return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
方法的返回值通常会使用变量接收,否则该返回值将无意义
4>return关键字的作用
①返回返回值(结果)
②并且停止方法
5>注意事项
①return后面的的返回值,与方法定义上的数据类型要匹配,否则报错
②方法的返回值通常会使用变量接受,否则给返回值讲无意义
6>方法通用定义格式
①格式
public static 返回值类型 方法名(参数){
方法体
return 数据;
}
②public static: 修饰符,先记住这个格式
③返回值类型: 方法操作完毕之后返回的结果数据所对应的数据类型
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
④方法名: 调用方法时使用的标识
⑤参数: 有数据类型和变量名组成,多个参数间用逗号隔开,方法运行之前所需要的材料
⑥方法体: 完成功能的代码块
⑦return: 如果方法操作完毕,有数据返回,用于把数据返回给调用者
**注意:**
★定义方法时,要明确两个概念
①明确参数:主要是明确参数的类型和数量
②明确返回值类型:主要明确方法操作完毕之后是否有数据返回,如果没有写void,如果有,写对应的
数据类型
★调用方法时:
①viod类型的方法,直接调用即可
②非void类型的方法,推荐用变量接受调用
五、方法的注意事项
1.方法不能嵌套定义
2.方法的返回值
方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写
如果要写,return后面不能跟具体的数据
3.return语句
热于任内语句下面,不能编写代码,因为永远执行不到,属于无效的代码
return可以用于结束代码,也就是将方法从栈内存中弹出去,该过程称之为方法的弹栈
package com.test02_method;
import java.util.Random;
/*
需求:定义一个方法,获取一个in类型数组的元素平均值
//用随机数录入接收数组元素
*/
public class Demo07 {
public static void main(String[] args) {
//提示用户输入
System.out.println("请输入数组元素");
//数组动态初始化,接收录入元素
int [] arr =new int[10];
//调用方法
int arrAvg = getArrAvg(arr);
//打印平均值
System.out.println("元素平均值为"+arrAvg);
}
//1.定义方法
public static int getArrAvg (int [] arr ){
//2.定义求和变量
int sum = 0;
//3.遍历数组
for (int i = 1; i < arr.length; i++) {
//4.元素求和
//定义随机数
Random r = new Random();
//收随机数
int number = r.nextInt(100)+1;
//数组接收随机数
arr[i] = number;
System.out.print("第"+i+"个元素的值为"+arr[i]+" ");
//累加
sum += arr[i];
}
//5.计算平均值
int avg = sum/arr.length;
//返回平均值
return avg;
}
}
package com.test02_method;
//需求:定义一个方法,获取一个in类型数组的元素平均值
//用随机数录入接收数组元素
import java.util.Scanner;
public class Demo08 {
public static void main(String[] args) {
//定义数组,动态初始化,定义数组长度
int [] array = new int[10];
//调用方法,接收平均数数据
int avg = getArrayAvg(array);
//打印平均数
System.out.println("数组元素的平均值为"+avg);
}
//定义带参方法
public static int getArrayAvg(int []array){
//创建键盘对象
Scanner sc = new Scanner(System.in);
//定义求和变量
int sum = 0;
//数组遍历
for (int i = 0;i < array.length;i++){
//提示用户分别输入数组元素
System.out.println("请输入第个"+(i+1)+"数组元素");
//接收键盘录入的数据
int number = sc.nextInt();
//将键盘录入的数据赋值给数组
array[i] = number;
//数组元素累加求和
sum += array[i];
}
//定义平均数变量并赋值
int avg = sum/array.length;
//返回平均数数据
return avg;
}
}
六、方法的重载
1.方法重载
1> 思考:在同一个类中,可不可以存在同名的方法
①方法名相同,参数也完全相同,称为方法的重复定义,是一种冲突性的错误;
②所以在Java中,可以存在同名的方法,但参数不能相同,若参数也相同,就会报错
③调用方法的时候,Java虚拟机jvm会通过参数的不同来区分同名的方法
2>什么是方法重载
在同一个类中,定义了同名的方法,但每个方法具有不同的参数类型或者参数个数,这些重名的方法,就构成了重载关系
简单记 : 同一个类中,方法名相同,参数不同的方法(参数不同:个数不同 , 类型不同 , 顺序不同\)
注意 : 识别方法之间是否是重载关系,只看方法名跟参数,跟返回值无关
3>方法重载特点
方法中参数的不同可以构成重载 , 但是不建议
4>方法重载的好处
不用记忆过多繁琐的方法名字
七、方法的参数传递
1.方法参数传递===>基本数据类型
package com.test02_method;
public class Demo11 {
//方法参数传递基本数据类型:
// 传入方法中的,是具体的数值
public static void main(String[] args) {
int number = 100;
//调用方法前,number输出100
System.out.println(number);
change(number);
//调用方法后,方法执行完毕,会从栈内存中弹出去
//而number赋值200后会跟着方法一起谈出去
//所以在这里二次打印的number是存在main方法的100
System.out.println(number);
}
public static void change(int number){
number = 200;
}
}
2.方法参数传递===>引用数据类型
package com.test02_method;
public class Demo12 {
//方法参数传递为引用苏话剧类型
// 传入方法的是内存地址
public static void main(String[] args) {
//定义数组
int [] arr = {10,20,30};
//调用方法前使用arr的地址值输出索引[1]的值并输出
System.out.println(arr[1]);
//调用方法,使用同一个地址值,对数组arr里面索引[1]的值做改变
//但是在方法执行后,方法体弹出栈内存,
//但是对数组里面索引[1]的值做的改变并没有失效
change(arr);
//所以当前打印的是方法对数组里面索引[1]改变之后的 值
System.out.println(arr[1]);
}
public static void change(int [] arr){
arr [1] = 200;
}
}
3.练习:
package com.test02_method;
//需求:定义方法,同时获取数组的最大值和最小值
public class Demo13_getMV {
public static void main(String[] args) {
//6.定义数组
int [] arr1 = {11,22,33,44,55,66,77};
//7..调用方法
int [] arr2 = getMV(arr1);
//8.将max和min取出打印
System.out.println("最大值为:"+arr2[0]);
System.out.println("最小值为:"+arr2[1]);
}
//1.定义方法
public static int[] getMV(int [] arr1) {
//定义最大值变量
int max = arr1[0];
//定义最小值变量
int min = arr1[0];
//遍历数组
for (int i = 0; i < arr1.length; i++) {
//2.求最大值
if (arr1[i] > max) {
max = arr1[i];
//3.求最小值
} else if (arr1[i] < min) {
min = arr1[i];
}
}
//4.将最值装入一个数组容器
int [] arr2 = {max, min};
//5.返回数组
return arr2;
}
}
八、方法的内存图
1>.方法调用的基本内存原理
2>方法传递基本数据类型的内存原理
3>方法传递引用数据类型的内存原理