一、方法的概述
什么是方法?
定义:方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复使用。
完整格式:
修饰符 返回值类型 方法名 (形参表){
方法体代码(需要执行的代码功能);
return 返回值;
}
比如:
public static double sum(double a,double b){ //返回值类型为int型
double c=a+b;
return sum;
}
为什么要使用方法?
使用方法可以提高代码的复用性,提高开发效率,让程序的逻辑更清楚。
用人话讲就是:张三可以用这个代码,李四也可以使用这个代码做一些功能。
方法应该怎样使用?
方法只有在被调用时才能使用。
调用格式为:方法名(……);
情景需求:
新手小白需要计算两个数据的相加运算,而新手小绿也需要计算两个数据的相加运算,于是小白为了提高代码的复用性,能多次使用。运用”方法”写了如下代码:
//首先定义方法:两个数据进行相加。注意定义的方法不在main主函数中
public static double sum(double a,double b){
double c=a+b; //相加
return sum; //返回对应类型
}
//接下来调用方法
double rs = sum(50,80); // 计算50+90的值
System.out.println(rs);//输出
方法定义时需注意:
方法的修饰符:暂时都使用public static修饰
方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。
形参列表可以有多个,甚至没有;如果有多个行参,多个形参必须使用“,”隔开,且不能初始化。
二、方法的其他定义形式
在设计方法时应该按照需求设计方法。
有时不需要返回值,又是不需要参数,所以可以分为:
无参数,无返回值的方法
无参数,有返回值的方法
有参数,有返回值的方法
无参数,无返回值的方法:
public static void helloworld( ){
System.out.println("Hello World");
}
//定义一个输出一次Hell World的方法
无参数,有返回值的方法:
public static void helloworld( int n){
for(i=1;i<n;i++){
System.out.println("Hello World");
}
}
//定义一个输出一次n次Hell World的方法
有参数,有返回值的方法
也就是我们刚开始学习的方法。
三、方法使用时的常见问题
方法可以放在前面也可以放在后面,但是一个方法不能定义在另一个方法中,所以不能在main中i当以方法。
方法的返回值类型写void时,方法内不能使用return返回数据。如果方法的返回值类型写了具体类型,方法内需要使用return返回相对应的类型。
return语句的下面不能写代码,因为执行不到这里。
方法不调用就不会执行,调用方法时,传给方法的数据,必须是匹配方法的参数情况。
调用有返回值的方法,有3种方式:
可以定义变量接受结果
或者直接输出调用
甚至直接调用
调用无返回值的方法:只有1种方式:只能直接调用。
四、设计方法的技巧
我们在设计方法时,主要关注三个方面:
方法是否需要接受数据进行处理?
若不需要接受数据,就是无参数
方法是否需要返回数据?
若不需要返回数据,定义方法的返回值类型就是void,并且不能使用return返回数据。
方法要处理的业务能力(编程能力)
在方法体代码中实现应该完成的需求
五、方法在计算机中执行的原理
方法被调用时,进入到栈内存运行的。
栈的特点:先进后出,后出先进。
图片截取自黑马程序员
六、Java的参数传递机制
Java的参数传递机制都是:值传递。
值传递:指的是在传输实参给方法的行参时,传输的是实参变量中存储的值的副本。
实参:在方法内部定义的变量。
形参:定义方法时“……”中所声明的参数。
public static void number(int a){
System.out.println( a );//输出形参a
a = 20;
}
int a = 10;
number(a);
System.out.println( a );//这里输出的会是多少?
因为java的参数传递机制是值传递,所以上面输出a的值是10。
在调用方法时间,只是将a的值赋给了方法,相当于:
number ( 10 );
还有一种情况是引用类型的参数传递:它也是值传递,但是和基本类型的值传递有所区别。
public static void number(int [ ] a){
System.out.println( a [1] );//输出数组第二个数据
a [ 1] = 20;
}
int [ ] a = {10, 30, 50};
number(a);
System.out.println( a );//这里输出的会是多少?
运行的结果是:
30
20
这里为什么和上面的代码不同呢?
其实运行原理是一样的,只不过数组在进行值传递时,是将地址码传递了。
然后修改了地址码中的数据。最后跳出方法后,输出的就是已经修改后的数据。
总结:基本类型和引用类型的参数在传递的时候有什么不同?
都是值传递,但是
基本类型的参数传输存储的数据值
引用类型的参数传输存储的地址值
数组是引用类型
七、方法重载
什么是方法重载?
定义方法时,在一个类中,多个方法的名称相同,但他们行参列表不同。
比如:
public static void number(int [ ] a){
System.out.println( a [1] );//输出数组第二个数据
a [ 1] = 20;
}
public static void number(int a){
System.out.println( a );
}
public static void number(int a,intb){
System.out.println( c=a+b );
}
上面定义的三个方法,方法名相同,但是形参表不同,定义是有效的。
一个类中,只要一些方法的名称相同、形参列表不同,那么它们就是方法重载了,修饰符,返回值类型是否一样也无所谓。
形参表不同指的是:形参的个数、类型、顺序不同。
八、return关键字
return:可以用在无返回值的方法中,作用是:立即跳出并结束当前方法的执行。
这个有什么用呢?
举一个例子:
需求:进行两个数字的除法用算:
public static void division (double a,double b){
if(b == 0){//判断分母为0 跳出
System.out.println( "0不能做分母");
return;
}
double c = a / b;
System.out.println(c);
}
division(80,4);
我们还学过其他跳出关键词:
break;跳出并结束当前所在循环的执行。
continue;结束当前所在循环的当次循环,进入下一次执行。