方法
把重复且有效代码抽取成的形式就是方法
书写格式
修饰符 方法返回值类型 方法名(参数列表){
方法体;
return 返回值;
}
修饰符:public static
方法返回值类型:提供返回值对应的类型来接收
没有返回值使用void
方法名:标识符
参数列表:由参数类型、参数个数以及参数顺序共同决定的
方法体:重复且有效的代码
return:把返回值来进行返回
注意:
1.方法只有被调用才能执行
2.两个明确:方法返回值类型,参数列表
3.return功能:结束方法,把返回值返回
4.当方法有返回值,考虑参数所有的取值情况给定对应的返回值
重载方法(前提是同一个类)
在Java中唯一确定方法——方法签名(由方法名和参数列表共同决定)
重载方法的调用:
在调用重载方法时,如果提供精确匹配方法就做精确匹配
如果没有提供精确方法匹配,就做相对精确匹配
如果提供多个相同程度的相对精确的匹配方法,就匹配不到就会报错。(最好提供精确匹配的方法)
代码:
public class MethodDemo2 {
//在java中唯一确定方法----方法签名(方法名和参数列表共同决定)
public static void main(String[] args) {
//重载方法的调用
System.out.println(sum(1,2));
}
//求和方法
//sum(int ,int)
public static int sum(int m,int n){
System.out.println("int,int");
return m+n;
}
//sum(double,int)
public static double sum(double m,int n){
System.out.println("double,int");
return m+n;
}
//sum(double,double)
public static double sum(double m,double n){
System.out.println("double,double");
return m+n;
}
}
方法传值
1.当实参为基本数据类型时,传递的是拷贝值
2.当实参为引用数据类型时,传递的是地址值的拷贝
如果拷贝的地址值找到原堆内存的就有可能有影响
如果拷贝的地址值没有找到原堆内存,做任何操作都不会有影响
代码:
public class MethodDemo3 {
//java中的方法被调用都是加载到栈中执行
public static void main(String[] args) {
int i=1;
//实参---实际传入的值
//当实参的数据类型是基本数据类型时传递是值的拷贝
//m(1);
int[] arr={1,2,3};
//数组元素是基本数据类型传递的是值得拷贝
//m(arr[0]);
//当实参类型是引用数据类型时传递的是地址值的拷贝
//n(arr);
//
mn(arr);
System.out.println(arr[0]);
}
//形参---接收实参的值
public static void m(int i){//接收的时拷贝值
i+=2;//操作拷贝值时不会影响原来的值
}
public static void n(int[] arr){//接收得是拷贝的地址值
arr[0]=9;//根据拷贝的地址值找到对应的堆内存改变元素值
}
public static void mn(int[] arr){//接收的是拷贝地址值
arr=new int[2];//拷贝的地址值被新数组的地址值覆盖了
arr[0]=9;//arr指向新数组改变元素值并不会影响原堆内存的元素值
}
}
有参有返回值
有参无返回值
无参有返回值
无参无返回值
方法递归
执行方法时调用本方法
例子:
sum(5)=1+2+3+4+5
return =5+sum(4)
4+sum(3)
3+sum(2)
2+sum(1)=1
StackOverflowError–栈溢出错误(递归次数过多)
代码:
packagecn.tedu.method;
publicclassMethodDemo1{
publicstaticvoidmain(String[]args){
System.out.println(sum(100));
System.out.println(sum(1000000)); //栈溢出错误
}
//定义递归求和的方法
publicstaticintsum(intm){
//递归结束条件
if(m==1){
return1;
}
returnm+sum(m-1);//5+sum(4)
//4+sum(3)
//3+sum(2)
//2+sum(1)
//sum(1)=1
}
}