一、参数类型
形参:方法被调用时需要传递进来的参数,使用时分配空间;调用结束即删除
实参:方法被调用时传递进来的实际值,在方法被调用前就已经被初始化,并且在方法被调用时传入。
值传递:在方法被调用时,实参通过把他的内容的拷贝副本传入方法内部,因此在方法内对实参的任何操作,都仅仅是对这个内容的副本进行操作,不影响原初始值的内容。
java中只用值传递
误区:
如果传输的是普通类型则是值传递,传输的对象则是引用传递
值传递和引用传递的区别取决于传递的参数是个值还是引用
改正:
在C++中引用传递是指在调用函数时将实际参数的地址传递到函数中
二、举例
例子:
基本数据类型的传递:将值拷贝给方法,但两个值的的地址值不同;方法在主函数调用弹栈后,拷贝的值不再使用,对基本数据不产生影响
public static void main(String[] args) {
int c =10;
int d=20;
Integer e =10;
Integer f=20;
swap(c,d);
System.out.println("int交换===========");
System.out.println(c);
System.out.println(d);
swap(e,f);
System.out.println("Integer交换===========");
System.out.println(e);
System.out.println(f);
}
private static void swap(int a, int b) {
int c =a;
a=b;
b=c;
}
private static void swap(Integer a, Integer b) {
Integer c =a;
a=b;
b=c;
}
例子1:String字符串
public static void main(String[] args) {
String nameString = "张三";
name(nameString);
System.out.println("main--->"+nameString); 张三
}
public static void name(String name) {
name = "李四";
System.out.println("name--->"+name);李四
}
先将实参地址,赋值给形参(形参在栈内存中新开辟了一个新的内存空间,用于存储地址)。但是当再次给 String 类型的形参赋值(与实参内容不一样的值时),JVM首先会去字符串池中查找是否存在"李四"这个对象,如果不存在,则在字符串池中创建"李四"这个对象,然后将池中"李四"这个对象的引用地址返回给形参,这样形参会指向池中"李四"这个字符串对象
例子2:类
public static void main(String[] args) {
User1 a = new User1();
User1 b = new User1();
a.setName("wxt");
b.setName("ww");
System.out.println("原始===========");
System.out.println(a);
System.out.println(b);
swap1(a,b);
System.out.println("User姓名交换===========");
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println("User未交换===========");
System.out.println(a);
System.out.println(b);
}
private static void swap1(User1 e, User1 f) {
String name = e.getName();
e.setName(f.getName());
f.setName(name);
}
private static void swap(User1 e, User1 f) {
User1 a1= e;
e=f;
f=a1;
}
原始
swap1
swap方法,实参将堆内地址值赋值给副本,都指向同一个位置;该方法只是改变了副本的指向,实参指向的位置并未改变,调用结束后形参将被删除;因此并未造成实参改变
从地址上来看a,b实参指向的位置始终没变