该文章Github地址:https://github.com/AntonyCheng/java-notes
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
上一章:由浅到深认识Java语言(6):控制流程语句
14.方法(函数)(方法:类的第三成员)
一般情况下,在面向过程的语言中,称为函数,在面向对象的语言中称为方法,所以 java 中我们称之为方法,通过方法将代码封装在一起,能够提高代码的效率;
我们通过统计学校人数这样一个示例来初识方法:
import java.util.*;
class demo{public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("你想知道我们学校的人数么(想/不想=1/0):");int agree = scanner.nextInt();if(agree == 1){ThePeopleAmount(); //这里是方法的调用}else if(agree == 0){System.out.println("ok!");}else{System.out.println("错误!请重新输入!");}}public static void ThePeopleAmount(){ //这是一个方法//我们来统计一个学校的人数int gradeOne = 1000; //高一int gradeTwo = 1200; //高二int gradeThree = 800; //高三int all = gradeThree+gradeTwo+gradeOne;System.out.println("我们学校一共有"+all+"人!");}
}
打印效果如下:
方法的定义
定义格式:
权限修饰符 (静态)标识 返回值类型 方法名(参数列表){方法的内容
}
注意:权限修饰符可有可无,标识处也可以不为静态的标识;
示例如下:
public static int method(int a,int[] arr){//方法内容如下:……
}
返回值类型
-
所谓的返回值就是方法执行完后,要返回的值;
-
返回给方法的调用处;
-
定义方法时,方法的返回值类型必须和具体的返回值类型完全相同;
public static int name(){ //方法数据类型是 int//方法的内容return 10; //返回值数据类型是 int }
-
return 之后不能有语句,因为程序是顺序执行的;
-
如果方法的返回值处事具体的数据类型,那么方法里必须有 return + 具体类型的值;
依然以统计人数举例:
import java.util.*;
class demo{public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("你想知道我们学校的人数么(想/不想=1/0):");int agree = scanner.nextInt(); //此时数据类型和方法数据类型一致if(agree == 1){int all = ThePeopleAmount(); //这里是方法的调用System.out.println("我们学校一共有"+all+"人!");}else if(agree == 0){System.out.println("ok!");}else{System.out.println("错误!请重新输入!");}}public static int ThePeopleAmount(){ //这是一个整数方法//我们来统计一个学校的人数int gradeOne = 1000; //高一int gradeTwo = 1200; //高二int gradeThree = 800; //高三int all = gradeThree+gradeTwo+gradeOne;return all; // 让ThePeopleAmount() == 300;}
}
打印效果如下:
示例:
打印金字塔:
import java.util.*;
class demo{public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("你确定要打印金字塔吗?(是/否=1/0)");int agree = scanner.nextInt();if(agree == 1){System.out.println("请问你要打印几个金字塔?");int x = scanner.nextInt();if (x <= 0){System.out.println("请输入正确数据!");}else{System.out.println("这是你的金字塔:");for(int i = 0; i < x; i++){TheBeautiful();}}}else if( agree == 0){System.out.println("okk!");}else{System.out.println("请输入正确的数字!");}}public static void TheBeautiful(){for(int i=0; i<3;i++){for(int j=0; j<2-i;j++){System.out.print(" ");}for(int k = 0; k<i+1;k++){System.out.print("* ");}System.out.println();}}
}
打印效果如下:
参数列表
参数列表是为了暴露出在调用方法时,可以传入方法内部,供方法内部使用的值;
参数列表是由多个参数组成的列表,多个参数之间使用 ”,“ 隔开;
public static int addParam(int a,int b){int sum = a+b;return sum;
}
参数列表有两个维度:
- 形式参数列表:在方法定义时使用的参数列表;
- 实际参数列表:在方法调用时使用的参数列表;
方法的调用
使用一个方法就是所谓方法的调用,让方法中的方法体运行,这就是方法的调用;
方法定义好以后没有调用,方法是不会执行的;
-
方法的调用格式:
方法名(实参列表);
-
实参列表该怎么写:
实参列表的写法必须参看形参列表,也就是说实参列表的个数,数据类型,顺序必须和形参列表完全相同;
示例一:
public static void main(String[] args){MethodOne(10); //只要是一个 int 就行MethodTwo(1,2);MethodTwo(3,"name");
}
public static void MethodOne(int a){System.out.println("MethodOne");
}
public static void MethodTwo(int a,int b){System.out.println("MethodTwo");
}
public static void MethodThree(int a,String name){System.out.println("MethodThree");
}
打印效果如下:
示例二:
创建一个两数相乘的方法,将两数作为参数,调用此方法获得结果并且打印此结果;
import java.util.*;
class demo{public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个数:");int a = scanner.nextInt();System.out.println("请输入第二个数:");int b = scanner.nextInt();System.out.println(Method(a,b));}public static int Method(int a,int b){System.out.println("你的答案是:");int result = a*b;return result;}
}
打印效果如下:
递归(了解)
定义:程序调用自身的编程技巧称为递归,方法内调用的方法执行的动作恰好和本方法一样,我们就可以调用这个方法本身,根据不同参数再执行一遍;
**注意:**为了防止无休止的调用,递归程序必须有一个结束的点,即不再执行程序的条件;
**示例一:**求阶乘;
import java.util.*;
class demo{public static void main(String[] args){//求阶乘Scanner scanner = new Scanner(System.in);System.out.println("你要计算的阶乘:");int num = scanner.nextInt();System.out.println(Method(num));}public static int Method(int num){if(num==1){ //不再执行程序的条件return 1;}else{return num * Method(num - 1);}}
}
打印效果如下:
而上述代码只能运行到 16 的阶乘,因为 int 类型是 32 位,最高达到 2 31 − 1 2^{31}-1 231−1;
所以我们可以把代码改写成 long 型;
import java.util.*;
class demo{public static void main(String[] args){//求阶乘Scanner scanner = new Scanner(System.in);System.out.println("你要计算的阶乘:");long num = scanner.nextInt();System.out.println(Method(num));}public static long Method(long num){if(num==1){return (long)1;}else{return num * Method(num - 1);}}
}
打印效果如下:
**示例二:**求斐波那契数列;
import java.util.*;
class demo{// 1 1 2 3 5 8 13 21 34...public static void main(String[] args){Scanner scanner = new Scanner(System.in);System.out.println("请输入第一个数:");int a = scanner.nextInt();System.out.println("请输入第二个数:");int b = scanner.nextInt();fbnq(a,b);}public static int fbnq(int a,int b){if((a+b)<100){System.out.print(a+" ");return fbnq(b,a+b);}else{return 0;}}
}
打印效果如下:
方法的重载
定义:
在一个类中,多个方法的方法名相同,但方法的参数列表不同,是可以同时存在的,并且构成了方法的重载;
参数列表不同指的是参数的数据类型不同:
- 方法名相同,参数列表的个数不同
- 方法名相同,参数列表的数据类型不同
- 方法名相同,参数列表的顺序不同
- 方法的重载和返回值类型,权限修饰符无关
public static void m1(int a){}
public static void m1(int b){}
//以上两种不互为重载
public static void m2(int a,double b){}
public static void m2(double a,int a){}
//以上两种互为重载
public static void m3(int a){}
public static int m3(int a){}
//以上两种不互为重载
示例如下:
import java.util.*;
class demo{public static void main(String[] args){Method(1,2);Method();}public static void Method(int a,int b) {System.out.println("int a,int b");}public static void Method(){System.out.println("void");}
}
打印效果如下:
方法重载的意义:
让开发者更加直观方便地使用一个方法,实现一种固定的功能,但是参数是可选的;