1.形参与实参
[1].形参:方法声明时,方法小括号内的参数
[2].实参:调用方法时,实际传入的参数的值
2.规则:java中的参数传递机制:值传递机制
[1].形参是基本数据类型的:将实参的值传递给形参的基本数据类型的变量
[2].形参是引用数据类型的:将实参的引用类型变量的值(对应的堆空间的对象实体的首地址值)传递给形参的引用类型变量。首
先看一下不调用方法的情况,变量的值是怎么变化的
package com.w4xj.newStart.unit;
public class TestArgsTransfer {
public static void main(String[] args) {
TestArgsTransfer tt = new TestArgsTransfer();
int i = 10;
int j = 5;
System.out.println("i:" + i + " j:" + j);
//交换变量i与j的值
int temp = i;
i = j;
j = temp;
System.out.println("i:" + i + " j:" + j);
}
}
运行结果:
i:10 j:5
i:5 j:10
变量都在栈空间里面通过temp变量完成交换,这样写没啥毛病,不过我们自然会想到写一个方法来做数据交换,接下来在TestArgsTransfer类中加入一个方法来进行数据交换
package com.w4xj.newStart.unit;
public class TestArgsTransfer {
public static void main(String[] args) {
TestArgsTransfer tt = new TestArgsTransfer();
int i = 10;
int j = 5;
System.out.println("i:" + i + " j:" + j);
tt.swap(i, j);// 将i的值传递给m,j的值传递给n
System.out.println("i:" + i + " j:" + j);
}
// 定义一个方法,交换两个变量的值
public void swap(int m, int n) {
int temp = m;
m = n;
n = temp;
System.out.println("m:" + m + " n:" + n);
}
}
运行结果:
i:10 j:5
m:5 n:10
i:10 j:5
由于传入的实参是基本数据类型,所以传递的实际是实际的值,所以在swap中操作的形参实际是在栈空间中单独的一份,随着swap方法执行完成,空间就被收回,而main方法中的i和j并没有变化
接下来我们把i和j抽象成一个类的成员变量,改变实例的属性,会怎么样呢
public class TestArgsTransfer1 {
public static void main(String[] args) {
TestArgsTransfer1 tt = new TestArgsTransfer1();
DataSwap ds = new DataSwap();
System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);
tt.swap(ds);
System.out.println(ds);
System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);
}
//交换元素的值
public void swap(DataSwap d){
int temp = d.i;
d.i = d.j;
d.j = temp;
System.out.println(d);//打印引用变量d的值
}
}
/**
* 当然类这样声明是不规范的,这里只是为了更直观些
*/
class DataSwap{
int i = 10;
int j = 5;
}
运行结果:
ds.i:10 ds.j:5
com.w4xj.newStart.unit.DataSwap@6d06d69c
com.w4xj.newStart.unit.DataSwap@6d06d69c
ds.i:5 ds.j:10
中间变量temp在swap方法结束后销毁,而swap方法中的参数是对象,也就是引用类型,所以调用swap方法后,在main方法中调用ds对象的属性也是改变后的
[3].特别的:String类型虽然是引用类型,但是String类没有改变值的方法,所以对String重新赋值,对象的地址是变了的,原本的值其实并没有改变,关于我对String类的详细理解,我将会详细的另写一篇博客
@Test
public void testStringHashCode(){
String str1 = new String("str1");
System.out.println(str1.hashCode());
changeStr(str1);
System.out.println(str1);
System.out.println(str1.hashCode());
}
private void changeStr(String str1) {
str1 = "str2";
System.out.println(">>>"+str1.hashCode());
}
/*
运行结果:
3541024
>>>3541025
str1
3541024
*/