该文章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");
}
}
打印效果如下:
方法重载的意义:
让开发者更加直观方便地使用一个方法,实现一种固定的功能,但是参数是可选的;