【JavaSE】Java入门二(方法详解)

目录

方法的使用

1.方法定义

2.实参和形参的关系

3.方法重载

4.递归


方法的使用

Java中的方法类似于C语言中的函数,目的都是解决程序设计中代码复用的问题。

1.方法定义

定义一个方法的语法格式如下:

// 方法定义
修饰符 返回值类型 方法名称 ([ 参数类型 形参 ...]){
方法体代码 ;
[ return 返回值 ];
}

对于没有返回值的方法,类型处写void。

需要特别注意,与C语言不同的是Java中的方法只能定义在类中,类外使用的时候可以通过定义对象来调用,要在入口方法(main)中使用需要在在定义方法的返回值前加上static关键字,直接比如下面这段例子

public class Method{
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}

方法调用的执行过程如下:

调用方法 --- > 传递参数 --- > 找到方法地址 --- > 执行被调方法的方法体 --- > 被调方法结束返回 --- > 回到主调方法继续往下 执行

2.实参和形参的关系

Java中定义方法时括号里面的参数为形参,在main方法中调用方法时传递的参数我们称为实参。

形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值 。(可以理解为形参只是实参在内存空间的一份拷贝,当方法执行完毕时,形参所占用的内存空间随方法体一同被回收)。
具体情况我们可以从下面代码中看出:
public class TestMethod {
public static void main(String[] args) {
int a = 10;
int b = 20;
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 = 20 y = 10
main: a = 10 b = 20

我们定义了一个交换方法,想交换两个数的值,但是因为在方法中只交换了形参的值,而形参的值在方法执行完就被销毁了,所以实参的值并没有发生交换。

对于基本数据类型来说,上述调用就是传值调用。

在Java中要想定义一个能交换两数的方法,我们就需要传引用数据类型(例如数组,包装类,字符串),Java中抛弃了C/C++中指针类型操控地址的设定,转而就是用引用数据类型来直接操作地址,Java中除了八大基本数据类型,其他的数据类型均为引用数据类型,所以我们靠传引用数据类型(相当于把实参的地址传给形参),就能保证形参和实参共用一份地址,即传址调用

public class TestMethod {
public static void main(String[] args) {
int[] arr = {10, 20};
swap(arr);
System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
}

public static void swap(int[] arr) {
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
}

// 运行结果
arr[0] = 20 arr[1] = 10

3.方法重载

Java中规定在同一个作用域中不能定义两个相同名称的标识符,比如:方法中不能定义两个名字一样的变量,但是类中可以定义方法名相同的方法(只需要返回值类型或参数列表不同即可)。

方法重载的目的是为了让我们在代码复用的时候更加方便,如下案例:

public class TestMethod {
public static void main(String[] args) {
add(1, 2); // 调用add(int, int)
add(1.5, 2.5); // 调用add(double, double)
add(1.5, 2.5, 3.5); // 调用add(double, double, double)
}
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;
}
}

为么呢?

因为Java的编译器会在编译阶段修改方法的最终名字,即方法签名:方法全路径名+参数列表+返回值类型,构成编译后方法完整的名字。

tips:只有方法名相同,参数列表或返回值类型不同时才能叫方法重载。

4.递归

递归是一种解决问题的方法,更是一种思想,它的特点是自身中又包含了自己

有些时候,我们 遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解 决之后,原问题就迎刃而解了
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
System.out.println("函数开始, n = " + n);
if (n == 1) {
System.out.println("函数结束, n = 1 ret = 1");
return 1;
}
int ret = n * factor(n - 1);
System.out.println("函数结束, n = " + n + " ret = " + ret);
return ret;
}

// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120

上述过程如下,有一个明显的递归过程:

tips:递归的使用非常消耗时间和空间,使用之前一定要避免递归深度过大。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值