一、方法的可变个数的参数.
问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递。那如何要给方法传递不同的参数?
.1.采用数组形参来定义方法
public static void test(int a, String[] books);
2.采用可变个数形参来定义方法
public static void test(int a, String... books);
说明:1.可变参数:方法参数部分指定类型的参数个数是可变多个
2.声明方式:方法名(参数的类型名... 参数名)
3.可变参数方法的使用与方法参数部分使用数组是一致的
4.方法的参数部分有可变形参,需要放在形参声明的最后(如果一个方法有多个的形参,可变的形参(...这种的参数)一定要放在所有的参数的最后,例如printInfo(String a,int b,String... args))
实例:1.用数组形参来定义方法
public class Person{ public void printInfo(String[] args){//用数组的方式来传递可变个数的参数,如果没有参数,就要定义一个空数组或者是null for(int i = 0; i < args.length; i++){ System.out.println(args[i]); } } public static void main(String[] args){ Person p = new Person(); String[] ii = new String[]{"李白", "18"}; p.printInfo(ii); String[] oo = new String[]{"唐朝", "诗人","酒鬼","剑仙"}; p.printInfo(oo); } }
打印结果为:
同实例:2.使用可变个数形参来定义方法
public class Person{ public void printInfo(String... args){//用Java特有的...方式来传递可变个数的参数,这种参数在使用时与数组的使用方式相同 for(int i = 0; i < args.length; i++){ System.out.println(args[i]); } } public static void main(String[] args){ Person p = new Person(); p.printInfo("杜甫","16","男"); String[] ii = new String[]{"唐朝", "诗人","追星"}; p.printInfo(ii); } }
打印结果:
二、方法的参数传递
方法:必须在其所在类或对象调用才有意义。方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
问题:那么,Java的实参值如何传入方法呢?
答:Java中方法的传递只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
1.方法的参数传递之基本数据类型
基本数据类型,值是保存在栈中。
实例1:
public class Test1 { 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); } }
打印结果为:
过程解析:1.代码先执行int a = 0,在栈中开辟了一块内存,地址为AD8500,存的值为0
2.调用swap方法,执行int i部分,在栈中开辟一块内存,地址是AD8600,值就是从a那里复制过来的值0,
3.调用swap方法体里面的代码,i = 6,把i在栈中的值0更改为6,最终i在栈中的值就是6
4.总之,基本数据类型在参数的传递过程中,就是把实参的值复制值到形参上。
2.方法的参数传递之引用对象
引用对象,值保存在堆中,栈中存的是对象在堆中的地址
public class DataSwap { public int a; } public class test { public static void swap(DataSwap ds1){ ds1.a = 6; System.out.println("在swap方法中,ds1.a的值是:" + ds1.a); } public static void main(String args[]){ DataSwap ds = new DataSwap(); System.out.println("调用swap方法之前,ds.a的值是:" + ds.a); swap(ds); System.out.println("调用swap方法之后,ds.a的值是:" + ds.a); } }
打印结果:
过程解析:1.代码先执行DataSwap ds = new DataSwap();把new DataSwap()存到了堆内存中,地址BE2500。
2.ds引用对象存到栈中,地址是AD9500,值是new DataSwap()对象在堆中的地址BE2500。
3.调用swap方法,给ds1引用对象保存到栈中,地址是AD9600,存的值是来源于实参(ds)的值,也就是ds在栈中存的值,实际上就是之前new DataSwap()对象在堆内存中的地址。
4.到第3步,ds和ds1其实都是指向同一个对象,这个对象就是在堆内存中地址是BE2500所保存的对象(new DataSwap()对象)。
总结:方法的参数传递
1.如果方法的形参是基本数据类型,那么实参(实际的数据)向形参传递参数时,就是直接传递值,把实参的值复制给形参
2.如果方法的形参是对象,那么实参(实际的对象),向形参传递参数时,也是把值给形参,这个值是实参在栈内存中的值,也就是引用对象在堆内存中的地址
3.基本数据类型都是保存在栈内存中,引用对象在栈内存保存的是引用对象的地址,那么方法的传递实际就是传递值(这个值就是变量在栈内存中的值)