方法参数的传递
方法的使用
本质上是一个方法模块去调用另一个方法模块中的代码。
在很多情况下,被调用的方法模块(methodA)需要用到调用方(main)的数据。 而根据变量的作用域,main当中的数据只能在main方法内部操作,methodA看不到也操作不到,所以我们需要传参。
当我们调用代码的时候,首先不是执行{}内的语句,而是先执行"()"当中的形参语句,而形参语句的语法就是声明变量。所以一旦调用methodA,会先在methodA当中申明一个叫做a的整型变量。
然后,JVM会做数据传递,把实参的值传递给形参变量,因此a里面被放上了100。在method当中对a进行任何操作,都不会直接影响到main当中的num,如果要想影响,只有让methodA把a变量的值返回出去,并且重新赋值给num。
- 在Java当中参数只有一种传递方式 --- "值传递" ,永远都是把实参的"值"传递给形参。
只是由于Java中基本数据类型变量和引用数据类型变量保存值的方式不同,造成了效果上的差异!(牢记:不是传递方式的不同)基本数据类型变量的值是保存在变量本身当中的,所以是把真正的数据值传递给形参;引用数据类型变量的值是指向真正数据的引用,所以传参的时候是把这个引用传给了形参,从而导致形参和实参指向了同一个真正的数据(对象)。
- JDK新语法:当用数组作为参数的时候,可以把形参设计为可变参数
- 传统写法 在调用处,只能是申明一个明确的数组对象,然后把该数组对象作为实参进行传递。
- 可变参写法 在调用处,即可以像传统方式直接传递一个数组对象(代码49行),也能够采用元素罗列的方式进行传递(代码50行),这样做就在某些场景中省略了申明数组的语句。
public static void methodD(String... args){
System.out.println(args.length);
System.out.println(args[0]);
}
当然,作为形参的args仍然在methodD方法中被认为是一个数组,应该继续使用数组的语法进行操作。
方法调用栈
-
程序执行的顺序:
- 默认是从main方法的第一句代码顺序往下,直到main方法的最后一句;
- 分支语句和循环语句打破顺序执行; 分支语句控制了根据条件执行某部分代码,而让另外一部分代码不执行; 循环语句控制了某部分代码被反复的连续执行。
- 方法的调用其实也改变了顺序执行。 一旦发生了方法调用,那么程序的流程就会离开调用处,进入被调用方法内部执行, 直到该方法执行结束,然后再返回方法调用处继续往下执行。
在方法连续进行嵌套调用的时候,先调用的方法后结束,后调用的方法先结束。 这种顺序形成了"先进后出"的效果,专业词汇叫做"栈"。
方法重载
所谓方法重载就是在一个java类当中允许命名多个重名的方法。名字一样的情况下,是依赖参数列表的不同来区分他们的,不考虑返回类型的不同
参数列表的不同包括:参数的个数不同,参数的类型不同,参数顺序不同,跟参数名无关。
递归
一个方法自己调用自己本身,在效果上它就是一种循环,循环执行该方法自己内部的代码。
递归的关键是控制循环的结束,也就是说自己内部调用自己不能采用无条件调用, 一定要有一个判断,该判断的作用是让它在某个时刻停止自己调用自己,然后原路返回。
无论是for、while、do-while 还是递归,虽然都可以通过程序员的控制实现 相同的效果,但是在合适场景中使用最适用的语法才是自然的。
for - 明确直到循环次数 while - 不知道循环次数,只直到某个条件为假的时候退出循环 do-while - 与while相同,但至少要执行一次。 递归 - 上一次循环的结果,下一次循环的初始条件