目录
1.概念
把重复且有效的代码抽取的形式
2.格式
修饰符 方法返回值类型 方法名(参数类型1 参数名1,参数类型2 参数名2,…){
方法体;
return 返回值;}
修饰符:public static 方法
返回值类型:根据方法返回值的类型指定对应的数据类型来接受
方法名:标识符
参数列表:由参数类型、参数个数、参数顺序 方法体:重复且有效代码
return:把返回值进行返回
3.注意
1.方法被调用才能执行
2.抽取方法时需要两个明确---方法返回值类型、参数列表
3.return两个功能:把方法的返回值进行返回、 结束方法
4.如果方法有参数,需要考虑参数值的取值范围,针对取值范围的内的数据进行操作
5.有参数有返回值 有参数无返回值 无参数有返回值 无参数无返回值
//IDEA边写边保存(自动编译)
public class MethodDemo1 {
//java规定方法不能嵌套(一个方法中不能定义另一个方法)
public static void main(String[] args) {
/* //打印6行7列的星星
for(int i=1;i<=6;i++){
for(int j=1;j<=7;j++){
System.out.print("*");
}
System.out.println();
}
//打印7行8列的星星
for(int i=1;i<=7;i++){
for(int j=1;j<=8;j++){
System.out.print("*");
}
System.out.println();
}
//打印8行9列的星星
for(int i=1;i<=8;i++){
for(int j=1;j<=9;j++){
System.out.print("*");
}
System.out.println();
}*/
//调用方法---方法名(参数值)--单独调用(执行方法)
printXing(6,7);
/* printXing(7,8);
printXing(8,9);*/
//输出调用(把方法返回值进行输出)
//System.out.println(sum(2,3));
//赋值调用(把方法返回值赋值给新变量)
//int x=sum(2,3);
}
//定义打印星星的方法
//方法返回值类型---直接打印效果,不需要返回值
//参数列表---int m int n(控制行和列)
public static void printXing(int m,int n){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==2)
return;
System.out.print("*");
}
System.out.println();
}
}
//求两个整数之和
//两个明确:方法返回值类型 int 参数列表 int x int y
public static int sum(int x,int y){
return x+y;
}
//判断一个整数是否是奇数
//两个明确:方法返回值类型 boolean 参数列表 int m
public static boolean isOdd(int m){//8
//非正常的情况
if(m<=0){
return false;
}
//正常范围的情况
if((m%2)==1){
return true;
}
//偶数
return false;
}
4.重载
在一个类中,多个方法名一致但是参数列表不一致
如果重载方法有精确匹配的方法做精确匹配
如果没有精确匹配的方法做相对精确匹配
如果出现多个相对精确匹配的方法不能匹配到对应的方法会报错
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.传值
如果实参的数据类型是基本数据类型那么传入的是值的拷贝
如果实参的数据类型是引用数据类型那么传入的是地址值的拷贝
如果拿着拷贝的地址值找到原堆内存就会影响原值
如果拿着拷贝的地址值没有找到原堆内存就不会会影响原值
public class MethodDemo3 {
//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]);
}
//形参---来接收实参
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;
}
}
6.递归
执行方法过程中再次调用本方法
StackOverflowError---栈溢出错误 递归次数过多
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)
}
}
递归的三大要素
第一要素:明确你这个函数想要干什么
第二要素:寻找递归结束条件
第三要素:找出函数的等价关系式