【知晓的丧day拯救计划】java基础学习笔记8 方法

笔记来自2019求知讲堂零基础Java入门编程视频教程 https://www.bilibili.com/video/av76235341

方法

方法(method)是一段用来完成特定功能的代码片段

方法定义语法格式:

修饰符 返回值类型 方法名(形式参数列表){
  方法体语句;
  return 返回值;
}

方法调用语法格式:
对象名.方法名(实参列表)

  • 修饰符:public,private,protected等;
  • 返回值类型:return语句传递的返回值的类型,没有返回值时为void。
  • 参数列表:[参数类型 参数名称],多个参数之间用逗号隔开;
  • 方法只有被调用才会被执行
  • 方法中只能调用方法,不能在方法中定义方法
  • 同一个类中的方法可以直接互相调用(static调用非static除外)

递归

方法中可以调用其他方法,自然也可以调用自己本身。

递归的基本思想就是自己调用自己,一个使用递归技术的方法会直接或间接的调用自己。使用递归一定要明确什么时候结束递归,不然会造成栈内存溢出程序崩溃。

递归结构包括两部分:

  • 递归头:什么时候不调用自身方法,也就是递归的结束条件。如果没有头,将陷入死循环。
  • 递归体:什么时候调用自身方法。

例:计算n!

//思路:计算n的阶乘等于计算n * (n-1)的阶乘
static long factorial(int n){
    if(n == 1){
        return 1;
    }else{
        return  n * factorial(n - 1);
    }
}
  • 注:在要求高性能的情况下应尽量避免使用递归,因为递归调用既耗时又耗资源。

方法的重载(overload)

方法重载:在同一个类里,允许存在一个以上的同名方法,只要他们的参数列表不同(参数个数不同、参数类型不同或参数顺序不同)即可,和参数名称无关,和返回值也无关。调用方法时,程序根据参数类型调用相对应的方法执行。

//以add方法为例
public int add(int x, double y) {
	return x + y;
}
//↓构成重载,参数类型不同(顺序不同也是重载)
public double add(double x, int y) {
	return x + y;
}
//↓构成重载,参数个数不同
public int add(int x, int y, int z) {
	return x + y + z;
}
//↓不构成重载,和参数名称无关
public int add(int m, double n) {
	return x + y;
}
//↓不构成重载,和返回值类型无关
public double add(int x, double y) {
	return x + y;
}

可变个数形参

当方法传入的参数个数不确定的情况下
1.可以使用数组传递可变个数的参数
2.用java的… 方式传递可变个数形参

//用数组方式传递可变形参
public void test(String[] args) {
	for (int i = 0; i < args.length; i++) {
		System.out.println(args[i]);
	}
}
//用可变个数形参...方式传递可变形参
public void test1(String... args) {
	for (int i = 0; i < args.length; i++) {
		System.out.println(args[i]);
	}
}

//方法调用
//test方法被我写在Student类里了,所以先实例化
Student student = new Student();  
//调用方法1:直接在参数列表中输入多个参数
student.test1("1", "2", "3");   
//调用方法2:将参数放入数组,把数组作为参数直接传递
String[] strs = new String[] {"1", "2", "3"};
student.test1(strs);

注:
1.可变个数形参声明方式:方法名(参数数据类型… 参数名)
2.使用可变个数形参和使用数组取用参数的方式是相同的,都是使用循环遍历的方式获取传递的全部参数(或使用下标获取某个参数)。
3.使用可变个数形参和使用数组参数,不构成重载,上面的例子中test和test1两个方法名不能相同。
4.一个方法的参数列表中最多只能有一个可变个数形参,且可变个数形参要放在参数列表最后
5.使用数组方式,如果没有参数,需要定义一个空数组或者传递null;而使用可变个数形参方式,参数列表可以为空。

方法的参数传递

形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值

Java中方法的参数传递方式只有一种——值传递。即将实际参数值的副本传入方法内,而参数本身不受影响。

了解值传递之前,首先需要了解JVM的内存模型
(JVM的内存模型详细介绍 java基础学习笔记补充 JVM内存模型、垃圾回收机制
JVM的内存模型

也就是说,基本数据类型,值是直接保存在栈中的;引用对象,值保存在堆中,而在栈中保存其在堆中的地址。

方法的参数传递之基本数据类型

//基本数据类型的参数传递
public class TestCanShu {
	public static void swap(int i) {
		i = 6;
		System.out.println("swap方法中参数i的值:" + i);
	}
	public static void main(String[] args) {
		int a = 0;
		swap(a);
		System.out.println("main方法中a的值:" + a);
	}
}
//运行结果:
//swap方法中参数i的值:6
//main方法中a的值:0

方法在传递基本数据类型时
①先执行int a = 0,在栈中开辟一块内存,存储的是值0;
②调用swap方法后,执行int i 部分时,在栈内存中另开辟一块内存,保存从a那里复制过来的值0;
③执行swap方法体i = 6后,把i在内存中的值改成6。
④方法调用结束后,释放i在栈中的内存。
由此可见,当方法传递的参数是基础数据类型时,调用方法后,只是将实参的值传递给了形参,而实参本身是不发生变化的。

方法的参数传递之引用对象

public class TestCanShu {	
	public static void swap(DataSwap ds1) {
		ds1.a = 6;
		System.out.println("swap方法里,a的值是:" + ds1.a);
	}
	public static void main(String[] args) {
		DataSwap ds = new DataSwap();
		System.out.println("执行swap方法前,main方法里,a的值是:" + ds.a);
		swap(ds);
		System.out.println("执行swap方法后,main方法里,a的值是:" + ds.a);
	}
}
//运行结果:
//执行swap方法前,main方法里,a的值是:0
//swap方法里,a的值是:6
//执行swap方法后,main方法里,a的值是:6

方法在传递引用对象时
①main方法执行DataSwap ds = new DataSwap()时,把new DataSwap()存在堆内存中,然后将堆中的地址作为ds的值存在栈内存中;
②调用swap方法后,执行DataSwap ds1部分时,在栈内存中另开辟一块内存,保存从ds那里复制过来的值,这个值就是对象在堆中的地址,所以此时,ds和ds1实际上引用的是同一个对象;
③执行swap方法体ds1.a = 6之后,改变的是堆内存中对象的属性值,所以不论是ds.a还是ds1.a,数值均发生改变。
④方法调用结束后,释放ds1在栈中的内存。
由此可见,当方法传递的参数是引用对象时,调用方法后,也是将实参的值传递给了形参,只不过此时的不是具体数据而是引用对象在堆内存中的地址,所以方法调用后,实参和形参实际操作的是同一个对象,相应的属性值也是同时改变的。

综上,Java中方法的参数传递的“值”传递,指的是参数变量在栈内存当中的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值