简单来说,Java当中的方法,类似于C语言当中函数。比如主方法main方法,在C语言当中,就是main函数,所有的程序都是由main方法开始,由main方法结束。下面,对Java当中的方法进行一个简单的回顾。
一、方法的概念和使用
1、什么是方法
方法就是一个代码块(片段),类似于C语言当中的函数。我们知道,在C语言当中,函数的存在使得代码模块化,大大提高了代码的效率。在Java中,方法也有着同样的作用:
(1)使代码能够重复使用。
(2)使代码模块化。
(3)直接调用现有的方法,比如Java封装好的方法,避免重复造轮子。
2、方法的定义
和C语言函数类似,方法的格式如下:
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]) {
方法体代码;
[return 返回值];
}
这里要说明的是修饰符。由于Java是面向对象的语言,在写代码的时候,方法的实现者希望方法的调用者不能修改他写的方法,就要通过限定修饰符private来进行封装,这就是是一种修饰符。 类似的还有public等等。
现在,我们写一个方法,来实现两个数的加法:
public static int add(int x, int y) {
return x + y;
}
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(add(a, b));
}
这里的修饰符是public和static,是public权限,说明这个方法可以被任意的方法来调用。而且可以被方法的调用者来修改。当然可以不加。static说明这个方法是静态的方法,因为main方法是静态的,要调用的方法也只能是静态的:
具体的原因要到类和对象来说明。这里建议加上public和static。
注意事项:
(1)方法的返回值类型:如果有,返回值类型要和返回的实体类型一致,否者写成void。
(2)方法的名称:应当使用小驼峰命名。
(3)方法的参数列表:如果没有,什么都不写,否者需要指定参数类型,多个参数使用“,”来隔开。
(4)方法体:要实现功能的代码块。
(5)方法要写在类的里面。上面的add方法是写在一个public主类里面的。
(6)方法不存在声明,也不能嵌套定义。
3、方法的调用
在main函数中调用方法,将参数传进去,然后,内存就会去寻找方法的地址,找到后,执行被调用方法的方法体,被调用方法结束后,返回结果,回到主调方法继续执行。一个方法,可以被多次调用。在定义方法的时候,是不会执行方法的代码,只有在调用的时候才执行。
说到这里,就要说明实参和形参。
形参是实参的一份临时拷贝。形参和实参是两个不同的实体,改变形参对实参没有影响。比如:
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
System.out.println(x + " " + y);
}
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println(a + " " + b);
}
结果是显然的。
实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间,Java是拿不到这块内存的,C语言只需要&就可以了)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b与形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。
在C语言当中,想要改变实参的值,就要用到指针,而Java没有指针的概念。要进行交换,可以使用数组,类和对象来实现。也就是说,在Java中,所有的调用都是传值调用,不存在传址调用,地址也是一个值。
要实现的话,使用数组来实现:
二、方法的重载
1、为什么需要方法的重载
比如实现两个数的相加的方法。在参数列表里面写了两个int,我们传的时候,只能传int的参数。现在想要实现double的相加,那就在写一个新的方法,提供新的方法名,但是取名字本来就是很让人头疼。而方法的重载可以让我们旧瓶装新酒。
2、方法重载的概念
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。比如官方的几个方法重载,以Arrays.copyOf(数组的拷贝)举例:
在这里,对copyOf方法进行了重载,以至于可以拷贝整型的,字符型的等等。
3、方法重载的要点
(1)方法名一定要相同
(2)参数列表要不同,比如参数列表的参数顺序,参数个数,参数类型。参数名不影响。
(3)返回值不做要求
编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法。那么上面的方法名称都一样,为什么重载后就不报错呢,这涉及到方法的签名,了解即可。
3、方法的签名
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
要了解方法的签名,就要用到Java汇编工具。汇编后,得到如下信息:
add:(DD)D,括号两个D说明double,外面的D说明是返回类型是double,前面的test等是方法的路径。
三、方法的递归
Java中方法的递归和C语言当中函数的递归是一样的,都是把一个大的问题转化成小的问题。这里参考本人的一篇实例。
使用递归实现n^k C语言_Naion的博客-CSDN博客https://blog.csdn.net/Naion/article/details/120406988?spm=1001.2014.3001.5501递归相对于循环,优点在于:代码少、逻辑好,但是理解比较难,浪费的空间多。有些题,天生适合递归,比如二叉树问题。递归需要多多的练习。