前言
方法顾名思义就是解决问题的办法,在C语言中,我们将方法称作函数,因此我们可以将Java中的方法理解成C语言中的函数,那么方法存在的意义是什么呢?举个例子:
现在有个同学A问老师:如何下载JDK?如何环境配置?如何下载IDEA?老师说:先这样,再那样,然后这样,最后那样,就可以了。之后又来一个同学B问同样的问题,老师又说了一边,老师发现这样很费事,就在CSDN上写了一个博客,同学C又来问同样的问题,老师说:你去我的博客看一下,博客上有教程,之后每个同学都能通过教程进行JDK下载,环境配置等,这就叫做方法,Java也是如此,将一个复杂的东西或者经常被调用的写成方法,这样通过调用就能实现重复使用了。
方法的基本用法
方法定义语法
基本语法:
方法定义:
public static 方法返回值 方法名称(参数){
方法体代码;
ruturn 返回值;
}
方法调用:
返回值变量 = 方法名称(实参)
举个例子:求1~n的和
public static int sumAdd(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum = sum + i;
}
return sum;
}
public static void main(String[] args) {
int ret=sumAdd(10);
System.out.println(ret);
}
我们创建一个sumAdd()的方法,跟C语言几乎没有区别,唯一的区别在于在返回值前面加上了public static,调用时我们用ret接收sumAdd()的返回值。
注意实现:
- 方法定义时, 参数可以没有. 每个参数要指定类型。
- 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void。
- 方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”。
- 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可。
- Java 中没有 “函数声明” 这样的概念。
我们在再来看一个例子:求1!+2!+……+n!的和
public static int fac(int n) {
int ret = 1;
for (int i = 1; i <= n; i++) {
ret = ret * i;
}
return ret;
}
public static int facSum(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum = sum + fac(i);
}
return sum;
}
public static void main(String[] args) {
System.out.println(facSum(5));
}
我们可以看到,我们用了两个方法,第一个是fac()方法,这个方法是求n!的值,而facSum()方法是求所有阶乘的和,我们可以发现方法中是可以在调用方法的。
实参和形参的关系
我们先看一个经典的例子:交换两个数字
public static void swap(int a, int b) {
int tmp;
tmp = a;
a = b;
b = tmp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("交换前:"+a+" "+b);
swap(a,b);
System.out.println("交换后:"+a+" "+b);
}
我们发现交换前后并没有发生变化,有同学会说,这是值传递,实参的值传给了形参,所以实参并没有发生变化,对的!值传递对实参没有影响,只会影响形参,但是一旦函数调用完,形参就会销毁,所以完成不了交换的方法,有的同学说了,C语言我们学过,可以传地址,是的!C语言是可以传地址,但是Java不可以,Java和C最大的区别就是没有地址的概念,所以Java并没有传地址的操作,因此我们无法传地址,那么我们没有办法写这个方法了嘛?当然不是,只是以我们的现在水平无法解决而已,我们现在这里留个悬念。
没有返回值的方法
方法的返回值是可选的. 有些时候可以没有的。
我们上面写的交换两个数字的方法就是一个没有返回值的方法(尽管没有实现两个数的交换),我们再来看一个例子:
public static void main(String[] args) {
int a = 10;
int b = 20;
print(a, b);
}
public static void print(int x, int y) {
System.out.println("x = " + x + " y = " + y);
}
我们可以看到我们实现打印的方法并不需要有返回值,因此方法并不一定需要返回值,是根据需求来的,如果需要返回值,就可以创建返回值的方法,如果不需要,就是用void类型的方法就行了。
方法的重载
方法的重载是Java新引入的概念我们来看一个例子:
public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
int a=10;
int b=20;
System.out.println(a+b);
double i=10.5;
double j=20.5;
System.out.println(i+j);
}
我们可以看到这两个方法名字都是add,但是参数的类型是不一样的,这就是一种方法的重载。方法的重载具有什么特征呢?
方法重载的特征:
- 方法名相同。
- 方法的参数列表不同(个数,类型)。
- 方法的返回值不做要求。
方法递归
递归我们在C语言中其实简单的学习过,递归就是一个方法在执行的过程中调用自身,就称为“递归”。
前提:
- 有一个趋近于终止的条件
- 自己调用自己
我们看一个例子:求n!用递归实现。
首先我们知道n!=n×(n-1)×……×2×1,那么我们可以写成公式写成n!=n×(n-1)!,因此func(n)=n×func(n-1),终止条件就是:当n=1时,跳出循环。
public static int fac(int n){
if(n==1){
return 1;
}
int tmp=n*fac(n-1);
return tmp;
}
public static void main(String[] args) {
System.out.println(fac(5));
}
我们以n=3举例,当为3时,3不等于1,tmp=3×fac(2),但是我们并不知道因此计算fac(2),2传进fac(2)中,2不等于1,因此先进行计算tmp=2×fac(1)(此时n=2),方式fac(1)也是需要计算,在进入fac()方法,计算fac(1),1等于1,那么返回1的值,此时fac(1)的值为1,因此fac(2)=2×fac(1)=2×1=2,返回fac(2)的值,因此fac(3)=3×fac(2),所以fac(3)=3×2=6。所以结果为6。我们在用图解来直观的看一遍。
①—②就是递归中“递”的过程,而③—⑤就是递归中“归”。方法的递归需要一定的积累,所以我们要勤于练习,熟练掌握递归方法的运用。
关于这次方法的使用博客就是这么多了,如果有什么建议或者意见欢迎各位私信评论,谢谢各位!