目录
前言
在Java初阶之方法定义与方法重载的学习中,我通过总结以及查阅资料,对以下问题有了更深一层的理解。
- 方法,也叫做函数,它的出现是为了解决什么样的问题?
- Java中方法是如何定义的?
- 方法到底有没有返回值以及返回值的类型到底是什么?
- 方法调用是如何实现的?
- 如何用方法来简化阶乘的求解?
- 什么是方法的参数传递?(如何理解形参和实参)
- 什么是方法重载?方法的重载出现是为了解决什么样的问题?(重载方法与返回值是否有关)
如果你在方法定义与重载的学习中也想对这些问题有一个更深的理解,请阅读这篇文章,或许会对你有所启发。
一、方法(函数)
某些代码块会被多处代码反复使用,这些代码就应该抽象方法,被需要使用的地方调用,这样就减少很多重复代码的定义,此时,前人便设计了方法,也就是函数,它的目的就是要实现代码的复用,减少重复代码,让编写出来的代码变得更加简洁明了。
二、Java中方法的定义
Java中方法定义的代码为:
public static 返回值 方法名称(){
//方法体代码
[return方法的返回值]
}
我们可以看到,在方法定义中要用return方法区返回他的值,但若方法没有返回值,return语句便可以忽略不写,若方法有返回值,return语句必须要写,值得我们注意的是,方法到底有没有返回值以及返回值的类型到底是什么,简单点说,就是此代码有没有参数以及参数的类型,要想知道这个问题,这就要取决于这个方法的作用是什么,这样看来,是不是有些生涩难懂,笔者用一个很常见的例子,定义一个方法判断一个年份是否是闰年,来说明这个问题。
代码展示:
public class runnian{
public static boolean isPrime(int year) {
if (year % 100 == 0) {
if (year % 400 == 0) {
return true;
}
}else {
if (year % 4 == 0) {
return true;
}
}
// 所有其他情况统统不是闰年,统一都返回false
return false;
}
}
当我们执行这个方法之后,我们必须要用boolean来证明返回的到底是true还是false,方法的作用就体现在public static boolean isPrime(int year){}这串代码中。一般来说,返回值为boolean的方法采用is开头来说明是或不是,其中,还有一个小小的点需要我们注意,便是方法的命名也采用小驼峰命名法。
三、方法调用
实现方法的调用,有一个完整的过程,便是从调用方法开始到传递参数到执行具体的方法体到方法执行结束再到回到调用处继续执行,完成了这些过程,我们才能说进行了一次方法调用,我们以调用两数相加的方法来举例说明方法的调用是如何实现的。
代码展示:
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("第一次调用add方法之前...");
int ret = add(a, b);
System.out.println("第一次调用add方法执行结束...");
System.out.println("ret = " + ret);
System.out.println("第二次调用add方法之前...");
ret = add(50, 60);
System.out.println("第二次调用add方法之后...");
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
System.out.println("调用add方法过程中,x = " + x + ",y = " + y);
return x + y;
}
}
结果展示:
第一次调用add方法之前...
调用add方法过程中,x = 10,y = 20
第一次调用add方法执行结束...
ret = 30
第二次调用add方法之前...
调用add方法过程中,x = 50,y = 60
第二次调用add方法之后...
ret = 110
在看到return时,我们便可得知,本次方法调用结束,要记住程序的入口就是从主方法main开始向下顺序执行。下面,我们来使用方法简化关于1!+2!+3!+4!+5!的求解。
代码展示:
public class Test {
public static void main(String[] args) {
int sum=0;
for(int i=1;i<=5;i++){
int tmpRet=factor(i);
sum+=tmpRet;
}
System.out.println(sum);
}
public static int factor(int num){
int ret=1;
for(int i=1;i<=num;i++){
ret*=i;
}
return ret;
}
}
我们可以看到,每次走到一个新的值i,就把这个值的阶乘计算交给函数factor去处理,大大简化了我们程序的逻辑。
四、参数传递
关于Java中方法的参数传递,其实只有值传递。下面我们给出形参和实参的概念。
- 形参:方法定义时,还不知道具体参数值,只知道当前方法定义时参数的类型,形式参数
- 实参:具体调用某个方法时,向方法传递的参数称之为实参,此时就有具体的值传递给了方法
需要注意的是,在Java中,无论形参和实参的类型是什么,实参的值永远都是拷贝一份赋值给形参,形参和实参本质上是两个不同的实体,形参和实参彼此不影响,这也就是我们所说的值传递!若某些方法没有返回值,在定义方法时使用void关键字表示该方法没有返回值(不能忽略),仍然可以在没有返回值的方法中使用return;表示结束当前方法的调用,如果还是有所疑惑,我们用一串代码来说明。
代码展示:
public static void swap(int[] num){
int tmp=num[0];
num[0]=num[1];
num[1]=tmp;
}
我们举从1开始到num,输出第一个3的倍数的例子,来说明显示的使用return语句来提前结束方法的调用。
代码展示:
public class Test {
public static void main(String[] args) {
print(10);
}
public static void print(int num){
for(int i=1;i<=num;i++){
if(i%3==0){
//此时找到第一个3的倍数
System.out.println(i);
//表示此时方法直接结束
return;
}
}
}
我们可以看到此时的return表示直接结束当前方法的执行。
五、方法重载(overload)
方法重载在Java中占有极为重要的地位,那么什么是方法重载呢,我们又该如何定义方法重载呢,其实方法重载就是在同一个类中,定义了若干个方法名称相同,参数列表不同(参数类型或个数不同),与返回值无关的一组方法,这样的一组方法。
一个概念的出现,必然是为了解决相应的问题,那方法重载的出现又是为了解决什么样的问题呢?比如我们要计算一个int类型的数与一个double数相加时,我们可以定义多个不同名称的方法来解决这个问题,但是对于用户使用来说非常不友好。因为每当传入不同参数时,就得调用不同名称,这样一来,用户使用成本太高,需要记非常多的方法名称,此时,在方法名称全都相同,参数列表不同的情况下,便引入了方法重载去简化问题,并且重载方法与返回值没什么关系,举个例子来说明。
代码展示:
public class MethodOverload {
public static void main(String[] args) {
int ret = add(10,20);
double ret1 = add(10.1,20.2);
double ret2 = add(30,20.3);
System.out.println();
}
public static double add(int x,double y) {
return x + y;
}
public static double add(double x,double y) {
return x + y;
}
public static int add(int x,int y) {
return x + y;
}
// 方法名称相同,参数列表也相同的方法,返回值不同,不是重载方法,编译出错!
// public static double add(int x,int y) {
// return x + y;
// }
}
其实在JDK中也定义了很多个重载方法,表现在无论什么类型扔给println都能惊醒打印,调用的方法也都是println。
我们一定要牢记的是,重载方法与返回值无关,因为返回值类型看得是这个方法的作用!
总结
以上就是今天所讲的内容,本节内容有出现了很多的代码,希望大家都能在代码的编写过程中掌握生涩难懂的相关概念!