方法
1.概念
把重复且有效的代码抽取的形式
2.格式
修饰符方法返回值类型方法名(参数类型1 参数名1,参数类型2 参数名2,…){
方法体;
return 返回值;
}
修饰符:public static
方法返回值类型:根据方法返回值的类型指定对应的数据类型来接受
方法签名:方法名和参数列表
方法名:标识符
参数列表:由参数类型、参数个数、参数顺序 方法体:重复且有效代码
return:把返回值进行返回
3.注意
1.方法被调用才能执行
2.抽取方法时需要两个明确---方法返回值类型、参数列表
3.return两个功能:把方法的返回值进行返回、 结束方法
4.如果方法有参数,需要考虑参数值的取值范围,针对取值范围的内的数据进行操作
有参数有返回值
有参数无返回值
无参数有返回值
无参数无返回值
4.重载
在一个类中,多个方法名一致但是参数列表不一致(参数的个数,参数的顺序,参数的类型)
如果重载方法有精确匹配的方法做精确匹配
如果没有精确匹配的方法做相对精确匹配
如果出现多个相对精确匹配的方法不能匹配到对应的方法会报错
package cn.tedu.method;
public class MethodDemo2 { //由方法名和参数列表共同决定的方法才是唯一确定的方法
//方法是由方法签名来区分(方法签名由方法名和参数列表共同决定)
public static void main(String[] args) {
//重载方法的调用
//如果重载方法有精确匹配的方法做精确匹配
//如果没有精确匹配的方法做相对精确匹配
//如果出现多个相对精确匹配的方法不能匹配到对应的方法会报错
System.out.println(sum(1,2));}
//求和
sum(int,int)
//Ctrl+Shift+?---选中代码进行注释(再按一边取消注释)
public static int sum(int x,int y){
//快捷键---Ctrl+d(快速复制一行)
//Alt+Shift+方向键(上下)---移动一行代码
System.out.println("int int");
return x+y; }
//sum(int,double)
public static double sum(int x,double y){
System.out.println("int double");
return x+y; }
//sum(double,int)
public static double sum(double x,int y){
System.out.println("double double");
return x+y; }
}
5.传值
如果实参的数据类型是基本数据类型那么传入的是值的拷贝
如果实参的数据类型是引用数据类型那么传入的是地址值的拷贝
如果拿着拷贝的地址值找到原堆内存就会影响原值
如果拿着拷贝的地址值没有找到原堆内存就不会会影响原值
package cn.tedu.method;
//Ctrl+Alt+insert---快捷键包建类
public class Method03 {
//java中所有的方法都是在栈中执行(不存储在栈中)
public static void main(String[] args) {
int i=1;
int[] arr={1,2,3};
//Alt+Enter---提示
//实参---实际传入的参数值
//如果实参的数据类型是基本数据类型,那么传递过去的就是拷贝值
//m(i);
//数组元素是基本数据类型,传递的仍然是值得拷贝
//m(arr[0]);
//如果实参数据类型是引用数据类型,那么传递的就是地址值的拷贝
//n(arr);
//mn(arr);
System.out.println(arr[0]);
System.out.println("java中所有的方法都是在栈中执行(不存储在栈中)");
}
//形参---来接受实参
public static void m(int i) {//接受到拷贝值做任何操作都不会影响原值
i++;
}//接受到拷贝值做任何操作都不会影响原值
public static void n(int[] arr) {//通过接收的拷贝的地址值可以找到对应堆里的内容就可以改变内容从而影响原值
arr[0]=10;
}
public static void mn(int[] arr) {//通过接收的拷贝值如果没有找到对应的堆内存,做任何操作都不会影响原值
arr=new int[5];
arr[0]=10;
}
public static int sum(int m) {//通过接收的拷贝的地址值可以找到对应堆里的内容就可以改变内容从而影响原值
if(m==1){
return 1;//返回sum(1)
}
return m+sum(m-1);
}
}
6.递归
执行方法过程中再次调用本方法
sum(10)=1+2+3+4+5+6+7+8+9+10
=10+9+8+7+6+5+4+3+2+1
10+sum(9)
9+sum(8)
8+sum(7)
7+sum(6)
6+sum(5)
5+sum(4)
4+sum(3)
3+sum(2)
2+sum(1)=1
StackOverflowError—栈溢出错误 递归次数过多
package cn.tedu.method;
public class MethodDemo4 {
public static void main(String[] args) {
System.out.println(sum(1000000));
}
//递归求和方法
public static int sum(int m){
//递归结束条件
if(m==1){
return 1;
}
return m+sum(m-1);//10+sum(9)
// 9+sum(8)
// 8+sum(7)}
}