Day05_方法
方法是一种语法结构,把一段代码封装成一个功能方便重复调用。
使用方法的好处是可以提高代码的复用性,让程序逻辑更清晰。
今天的任务:
- 怎么定义方法
- 方法有多种定义方法,需要结合应用场景确定定义方式
- 怎么调用方法
- 只有调用方法才能让方法跑起来
- 方法的内存图
- 方法在内存中如何工作
- 方法的参数传递机制
- 方法的参数传递原理,需要注意的内容
- 方法其他形式、技术
- 方法重载、方法递归
1、方法定义、调用
1.1、方法完整的定义形式、调用
//方法定义
修饰符 返回值类型 方法(形参列表){
方法体代码;
return 返回值;
}
eg:
public static int sum(int a,int b){
int c = a+b;
return c;
}
//方法调用
方法名(实参);
方法需要注意内容
- 修饰符:暂时都用 public static
- 返回值:如果确定的返回值类型就必须要有返回值,且返回值类型需要与声明返回值类型相同
- 形参列表:多个可以用","分隔
1.2、方法的其他定义形式、调用
- 方法不需要返回结果,则申明返回值类型为void;方法不需要参数,则形参列表可以不写
- 方法没有申明返回值类型,内部不能使用return返回数据。
- 方法如果没有形参列表,调用的时候则不能传入参数值,否则报错。
2、方法使用的常见问题
-
方法编写的时候顺序无所谓
//不论声明方法的顺序都可以正常使用 public static int add(int a, int b){ return a+b; } public static void main(String[] args) { int number = sum(1,2); int number2 = add(1,2); System.out.println(number); System.out.println(number2); } public static int sum(int a,int b){ int c = a+b; return c; }
-
方法与方法之间是平级关系不能嵌套定义
public static void main(String[] args) { int number = sum(1,2); int number2 = add(1,2); System.out.println(number); System.out.println(number2); public static int add(int a, int b){ return a+b; } } //抛出异常 expected ;
-
方法的返回值类型为void,方法不能返回数据,如果方法的返回值类型写了具体的类型,方法内部必须返回对应类型的数据。
-
return语句下面为无效代码。
-
方法不调用就不执行,调用时必须要匹配方法的参数情况。
-
有返回值的方法调用时可以选择变量接收结果,或者直接输出调用结果。
3 、方法案例
//需求:定义一个方法,计算出1-n的值,并返回结果
public static void main(String[] args) {
System.out.println(calculate(5));
}
public static int calculate(int n){
int sum = 0;
for (int i = 1; i < n+1; i++) {
sum+=1-i;
}
return sum;
};
//找出数组的最大值
public static int findMax(int []array){
int max = array[0];
for (int i = 0; i < array.length; i++) {
if (max < array[i]){
max = array[i];
}
}
return max;
}
public static void main(String[] args) {
int[] array = {4,55,35434,64564};
int max = findMax(array);
System.out.println(max);
}
//判断奇偶数
public static void main(String[] args) {
judge(5);
}
public static void judge(int a){
if(a%2 == 0){
System.out.println("是偶数!!");
}else{
System.out.println("是奇数!!!");
}
}
4、方法调用的内存图
- 方法 没有被调用时,在 方法区中的字节码文件中存放
- 方法 被调用时,需要进入 栈内存中
图示
5、值传递机制
5.1、基本类型的参数传递
在传输实参给方法形参的时候,并不是传输实参变量本身而是在传输实参变量中的值,这就是值传递,方法会在栈内存中创建一个新变量用于存储值传递的值。
注意:实参:方法内部定义的变量;形参:定义方法时,“()”中声明的参数
5.2、引用类型的参数传递
引用类型在值传递的过程中传递的为堆内存中的地址。
6、参数传递案例
//设计一个方法遍历输出数组内容
public static void forArray(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
public static void main(String[] args) {
int[] array = {11,22,33,44,55};
forArray(array);
}
//从数组中查询元素的索引返回
public static int findIndex(int[] array,int n){
for (int i = 0; i < array.length; i++) {
if(array[i] == n){
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] array = {11,22,33,44,55};
int n = 33;
int index = findIndex(array,n);
if (index!=-1){
System.out.println(index);
}else{
System.out.println("不在数组中!!");
}
}
//判断两个数组是否一样
public static boolean equalArray(int[] a,int[] b){
if(a.length!=b.length){
return false;
}
for (int i = 0; i < a.length; i++) {
if(a[i]!= b[i]){
return false;
}
}
return true;
}
public static void main(String[] args) {
int[] arrs1 = {1,2,3,4};
int[] arrs2 = {1,2,3,4};
int[] arrs3 = {1,2,3};
int[] arrs4 = {2,3,4,5};
System.out.println(equalArray(arrs1,arrs2));
System.out.println(equalArray(arrs1,arrs3));
System.out.println(equalArray(arrs1,arrs4));
}
7、方法重载
在同一个类中,出现多个方法名称相同,但是形参列表不同,那么这些方法就是重载方法。
重载方法的作用:
可读性号,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化选择。
在调用方法的过程中会通过传参来判断使用哪个方法
//开发武器系统,要求如下
//① 可以默认发一枚武器。
//② 可以指定地区发射一枚武器。
//③ 可以指定地区发射多枚武器。
//默认发射一枚武器
public static void fire(){
System.out.println("给米国来一发大宝贝");
}
//向指定地区发射一枚武器
public static void fire(String location){
System.out.println("给"+location+"来一发大宝贝");
}
//向指定地区发射多枚武器
public static void fire(String location,int number){
System.out.println("给"+location+"来"+number+"发大宝贝");
}
public static void main(String[] args) {
fire();
fire("漂亮国");
fire("宇宙国",10);
}
方法重载的识别技术
- 只要是同一个类中,方法名相同、形参列表不同,那么他们就是重载的方法。
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称
8、单独使用return关键字
- return; 可以体积跳出并结束当前方法的执行;return关键字单独使用可以放在任何方法中。
public static void main(String[] args) {
System.out.println("开始");
chu(10, 0);
System.out.println("结束");
}
public static void chu(int a, int b) {
if (b == 0) {
System.err.println("您的数据有误!!不执行!!");
return; // 直接结束当前方法chu
}
int c = a / b;
System.out.println("除法结果是:" + c);
}
开始");
chu(10, 0);
System.out.println(“结束”);
}
public static void chu(int a, int b) {
if (b == 0) {
System.err.println("您的数据有误!!不执行!!");
return; // 直接结束当前方法chu
}
int c = a / b;
System.out.println("除法结果是:" + c);
}