Java——方法
文章目录
- 什么是方法
- 方法的定义
- 方法的调用
- 形参改变不会影响实参的值
- 用方法求某个数的阶乘
- 方法重载(overload)
- 方法练习
- 题目一:
- 题目二:求和的重载
- 题目三:求最大值方法的重载
- 题目四:递归求汉诺塔问题
什么是方法
方法就是一个代码片段,类似于 C 语言中的 “函数”。
方法存在的意义:
-
是能够模块化的组织代码(当代码规模比较复杂的时候)
-
做到代码被重复使用, 一份代码可以在多个位置使用
-
让代码更好理解更简单
-
直接调用现有方法开发, 不必重复造轮子
在编程中,某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会:- 使程序变得繁琐
- 开发效率低下,做了大量重复性的工作
- 不利于维护,需要改动时,所有用到该段代码的位置都需要修改
- 不利于复用
因此,在编程中,我们可以将频繁使用的代码封装方法,需要时直接拿来使用即可,避免了一遍一遍的累赘。
方法的定义
方法语法格式:
//方法定义
修饰符 返回值类型 方法名称(形式参数列表){方法体;
}
示例一:
实现一个方法,检测一个年份是否位闰年
-
首先写方法的修饰符
public static
-
其次就是返回值类型,我们要检测一个年份是否为闰年,那么返回值类型就用
boolean
所以目前完整写为:public static boolean
-
检测一个年份是否为闰年,那么方法名称就取为
isLeapYear
。leap year
的中文意思是闰年。
目前完整写为:public static boolean isLeapYear
-
要检测一个年份是否为闰年,那么年份就作为参数,写为:
public static boolean isLeapYear(int year){方法体;}
注意:IDEA
有个特点,当方法上写了返回值类型boolean
后,如果没有return
(返回值),那么下面括号的波浪线会一直提示没有return
,加上个return false
(返回值)就可以了
-
我们在
isLeapYear
方法中加上一些信息,然后执行程序
发现程序什么也没有执行,这是因为程序是执行main
方法,而此时main
方法里什么也没有,所以什么也不会执行。 -
我们该怎么使
isLeapYear
方法运行呢?
方法的调用
这就是方法的调用。
在main
方法中写isLeapYear
方法,再给个参数2008
。此时运行程序就会调用isLeapYear
方法,打印方法被调用...
我们将判断年份的代码补齐
闰年的判断方法:
- 普通年份:能被4整除但不能被100整除的年份为闰年。例如:2004年能被4整除,且不能被100整除,所以是闰年;而1900年能被4整除,但也能被100整除,所以不是闰年。
- 世纪年份:能被400整除的年份是闰年。比如:2000年能被400整除,是闰年。
以上就是闰年代码的判断。
注意事项:
- 修饰符:现阶段直接使用
public static
这个固定搭配 - 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致;如果没有返回值,必须写成
void
- 方法名字:采用小驼峰命名
- 参数列表:如果方法没有参数,
()
中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开 - 方法体:方法要执行的语句
- 在Java中,方法必须要写在类中
- 在Java中,方法不能嵌套定义
- 在Java中,没有方法声明一说
- 定义方法的时候,不会执行方法的代码,只有调用的时候才会执行
- 一个方法可以被多次调用
总结,执行过程为:
程序走起来后先找到main
方法,若main
方法中有其他的方法,则调用方法——传递参数——找到方法地址——执行被调方法的方法体——被调方法结束返回——回到主调方法继续往下执行
再写段代码:实现两个整数相加的方法。
同样的:
修饰符public static
返回值类型int
方法名称add
形式参数列表(int x,int y)
最后再加上方法体。
public static int add(int x,int y){return x+y;
}
形参改变不会影响实参的值
写段代码
再修改一下代码:
此时实参与形参都是year
,它们是否一样呢?
当然是不一样的,在main
方法里的实参year
为2008
,而isLeapYear
方法里的形参year
是实参赋给它的值,为2008
。
把main
方法里的值给到isLeapYear
,修改isLeapYear
方法里的year
是不会影响到main
方法里面的year
的
写段代码验证:
这段代码中func
方法已经将year
的值修改为100
,但是最终打印出来的值仍是2008
这是因为在func
方法中修改的是形参的值,相当于将2008
改成了100
任何方法执行完后栈帧都会被销毁掉,所以当回到main
方法栈帧中去打印year
的时候还是2008
在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
再写段代码举例,我们写个方法可以实现两个整数交换
根据结果可知,x,y
仍然是10与20
,并没有交换。这是因为交换的是形参的a和b
,a和b
原本分别是10与20
,交换后a
变成了20
,b
变成了10
用方法求某个数的阶乘
这段代码中fac
方法的作用是求某个数字的阶乘,再通过sum+=fac(i)
将每个数字的阶乘相加。
用方法来组织内容可以将代码模块化,这个模块就是用来求每个数字的阶乘的,这就是方法的好处
方法重载(overload)
为什么需要方法重载呢?
我们写个可以实现两个整数相加的方法
我们再加上两个double
类型的数据
此时就不可以使用add
方法了,因为add
方法本身要接收的是int
类型的数据,编译器会报错: 从double转换到int可能会有损失。
我们为了两个double
类型的数据也可以相加:将原本整型相加的方法改成addInt
,再写个方法叫addDouble
用来计算double
类型的数据相加
上述代码确实可以解决问题,但是不友好的是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事情。那能否将所有的名字都给成add 呢?
这就有了方法重载的概念。在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
例如“好人这一概念”:你帮老爷爷过马路可以说你是好人;你对喜欢的女孩子表白,对方说“对不起,其实你是一个好人…”
在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
我们将这两种方法的名字都改成add
,即这两种方法被重载了(前提:方法名相同,参数列表不同)
我们敲出add
时就会有具体选择,想调用谁就选择谁
我们再写个add
方法
此时这三个就是互为方法的重载。
我们可以观察出以下特点:
-
方法名必须一样
-
参数列表必须不一样(形参的个数、形参的类型、形参的顺序)
例如我们再写一个add
,都是三个参数,形参类型每对也一样,参数列表一模一样,就会报错,不构成重载
但把位置改一下,虽然都还是三个参数,但是第二对形参类型不一样,此时就不报错了,构成重载
注意:这种情况下会报错,不构成重载
-
与返回值类型是否相同无关
这两个方法的返回值都是int
,构成重载
这三种方法的返回值不相同,也构成重载
所以方法返回值不论一样还是不一样,对构成重载不影响。我们主要看方法名和参数列表。
此时这4个add
构成了方法的重载,虽然都叫add
,但每个表达的意思不一样
总结:只要方法名一样,参数列表不一样,就构成重载
方法练习
题目一:
创建方法求两个数的最大值max2
,随后再写一个求3个数的最大值的函数max3
。要求:在max3
这个函数中,调用max2
函数,来实现3个数的最大值计算。
public static int max2(int a,int b){return a>b ? a:b;
}
public static int max3(int a,int b,int c){int max=max2(a,b);int ret=max2(max,c);return ret;
}
public static void main(String[] args) {System.out.println(max3(1, 2, 3));
}
题目二:求和的重载
在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。并执行代码,求出结果
public static int add(int a,int b){return a+b;}public static double add(double a,double b,double c){return a+b+c;}public static void main(String[] args) {System.out.println("计算两个整数的和:");int ret1=add(2,3) ;System.out.println(ret1);System.out.println("计算三个小数的和:");double ret2=add(1.0,2.0,3.0) ;System.out.println(ret2);}
题目三:求最大值方法的重载
题目内容:在同一个类中定义多个方法:要求不仅可以求2个整数的最大值,还可以求3个小数的最大值
public static int max(int a,int b){return a>b ? a:b;}public static double max(double a,double b){return a>b ? a:b;}public static double max(double a,double b,double c){double max=max(a,b);double ret=max(max,c);return ret;}public static void main(String[] args) {System.out.println("求两个整数的最大值:");int ret1=max(5,8);System.out.println(ret1);System.out.println("求三个小数的最大值:");double ret2=max(2.1,2.2,2.3);System.out.println(ret2);}