系列文章目录
《JAVASE系列》
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
《JAVASE系列》方法的使用 详解
前言:
本章主要讲解java中的方法,以及如何使用方法。
参考书籍:《java核心卷1》
你若盛开,清风自来。
1.方法的概念与使用
1.1 方法是什么?
有c语言基础,可以将方法理解为c语言中的函数。
方法就是一段代码,方法可以实现程序中的特定功能。比如实现一个判断素数功能的方法,我们在需要的时候就不需要写这一份代码,而是直接调用这个方法去实现功能。
方法的意义:
- 是能够模块化的组织代码
- 做到代码被重复使用, 一份代码可以在多个位置使用
- 让代码更好理解更简单.
- 能直接调用而不用重复冗余地去写相同功能的代码
1.2 方法的定义
定义方式:
方法的基础概念:
- 修饰符:现阶段直接用public static固定搭配。
- 返回值类型是需要自己去确定的,需要返回什么样的数据类型就确定什么样的返回值类型,如果没有返回值,就必须写出void类型。
- 方法名字:一般采取小驼峰的命名格式(代码规范)。
- 参数列表:方法中没有参数的话,可以直接不写参数,但是如果有多个参数,参数与参数之间需要用逗号隔开。
- 方法体: 也就是我们在方法内部实现功能的代码。
- 在java中,方法不能像c语言一样,方法必须写在类当中。
- 在java中,方法一样是不能嵌套定义的
- 在java中,方法没有声明这一概念。
1.3 方法的执行过程
如图代码的执行流程:
注意:
- 一个方法只有被调用的时候才会执行。
- 方法可以重复调用。
1.4 形参与实参的关系(重点)
什么是实参:实参是java程序中传递给方法的值。
什么是形参:形参是java方法用来接收实参的变量,形参只是方法用来接收实参的一个临时变量,用来保存传递过来的值,也就是说形参是实参的一份临时拷贝。
public static int add(int x,int y){
return x+y;
}
public static void main(String[] args) {
int a = 20;
int b = 10;
int rer = add(a,b);、
}
强调:形参与实参之间并没有直接的关系,仅仅只是实参的值拷贝到了形参中去而已,就算改变形参的值,也不会最终影响到实参。
例如
public class TestMethod {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("main: a = " + a + " b = " + b);
swap(a, b);
System.out.println("main: a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
System.out.println("swap: x = " + x + " y = " + y);
}
}
运行结果:
可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功。
原因分析:(重点)
实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,两者在不同的存储空间中,实参a和b 与 形参x和y是两个没有任何关联性的变量。 swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响。这也被称为 传值调用。
2.方法的重载
2.1方法重载的概念
多个方法名字相同,但是参数列表不同,则称为这几种方法被重载了
代码示例:
public class TestMethod {
public static void main(String[] args) {
int ret1 = add(1,2);
double ret2 = add(1.5, 2.5);
double ret3 = add(1.5, 2.5, 3.5);
System.out.println(ret1+" "+ret2+" "+ret3);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
运行结果:
重载的注意事项:
-
方法名必须相同。 也就是说,方法名相同是重载的首要前提条件,只有方法名相同的方法才能算是方法重载的使用 -
参数列表必须不同。(参数的个数不同、参数的类型不同、类型的次序必须不同) 方法的区别主要在于参数列表的不同,也是区别方法重载中不同方法的重要指标之一。 代码示例: public static int add(int x, int y) {
return x + y;
}
public static double add(int x,int y){
return x + y;
}
报错信息:
总结:
也就是说方法重载的唯一重点注意地方就在于参数列表,参数的个数要不同,参数的类型不同,类型的次序不同,三个不同满足一个即可实现方法的重载。
2.2方法的签名
方法可以实现重载,而变量却不行,原因就在于方法的签名之上。方法的签名让重载方法得以被虚拟机系统利用。
如何找到方法的签名呢。
我们用以下代码测试:
public class TestMethod {
public static void main(String[] args) {
int ret1 = add(1,2);
double ret2 = add(1.5, 2.5);
double ret3 = add(1.5, 2.5, 3.5);
System.out.println(ret1+" "+ret2+" "+ret3);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
-
先编译一下已经有重载方法 的idea的代码。 -
然后进入该代码所在的文件,进入out文件夹,找到字节码文件(后缀为.class) 在该文件夹里面,按住shift+右键,即可出现以下场景:
-
然后选择“在此处打开powershell窗口” 进入powershell窗口
-
然后输入 java -v (.class文件名) 即可出现java的编译代码情况:
-
方法签名如下: 我们可以明显的看到,重载的方法拥有着不同的方法签名。 签名的具体命名方式:方法全路径名+参数列表+返回值类型。
3.递归
3.1递归思想
递归思想在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解决之后,原问题就迎刃而解了。大问题化小问题的思想模式。
3.2递归概念
一个方法在执行过程中调用自身, 就称为 “递归”.
递归的必要条件:
- 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
- 递归出口
3.3递归代码练习
求n 的阶乘
public static int factorial(int n){
if(n==1){
return 1;
}
else{
return n*factorial(n-1);
}
}
代码分析:
通过自身调用自身来解决这个问题。这个递归的出口为n==1,也就是说,一个n的阶乘都是从n乘到1,所以到了1时,就应该终止运算。如果不是1,就继续运算n到2之间,也就是n*factorial(n-1)。
总结
方法其实与c语言的函数几乎没有区别,但是要注意java当中有方法的重载,而c语言却没有,这是一个比较巨大的差异,需要注意。
通过本章学习我们应该能回答出以下问题:
方法是什么?
方法的形参与实参之间是什么关系?
讲一下方法的重载?
掌握递归思想,可以用递归思想解决一部分算法题目。
感谢阅读。
与君共勉!
|