这边要学习的值传递有两种,基本类型值传递,对象值传递,分为下列四种
1.方法块内的基本类型值传递
2.方法块内的对象值传递
3.方法间的基本类型值传递
4.方法间的对象值传递
4.1 改变参数变量的属性
4.2 改变参数变量指向的地址
4.3 成员变量作为外部变量传参之后,在方法块内更改其地址
先给予总结:
-->>不管是基本类型值传递还是对象值传递,都是进行"拷贝"操作,外部变量与方法的参数要分开来考虑,
1.基本类型值传递时直接拷贝一份值给方法参数
2.对象传递时直接拷贝一份对象内存地址给方法参数,因为两者(外部对象,方法参数)持有的内存地址指向同一份内存,在参数改变某个属性时,方法参数指向的内存属性改变,外部对象通过相同内存地址指向了相同的内存,拿到的自然是改变之后的值
3.由2可知,两者(外部对象/方法参数)所持有的内存地址是同样的,但也是相互独立的,是可以各自改变的,方法参数要是被一个新的对象赋值,他的地址
4.能证明地址拷贝的是4.3
1.方法块内的基本类型值传递
int i = 2;
int b = i;
结果
/**
i --> 2
b --> 2;
*/
2.方法块内的对象值传递
/**
* 总结:两个局部变量将指向同一个内存地址
xiaowang: xiaowang
xiaowang内存地址: insert.VariableAddress$Person@14318bb
xiaosheng内存地址: insert.VariableAddress$Person@14318bb
xiaosheng: xiaowang
xiaowang: xiaowang
xiaosheng: xiaosheng
xiaowang: xiaosheng
*/
Person xiaowang = new Person("xiaowang");
System.out.println("xiaowang: " + xiaowang.getName());
Person xiaosheng = xiaowang;
System.out.println("xiaowang内存地址: " + xiaowang.toString());
System.out.println("xiaosheng内存地址: " + xiaosheng.toString());
System.out.println("xiaosheng: " + xiaosheng.getName());
System.out.println("xiaowang: " + xiaowang.getName());
xiaosheng.setName("xiaosheng");
System.out.println("xiaosheng: " + xiaosheng.getName());
System.out.println("xiaowang: " + xiaowang.getName());
3.方法间的基本类型值传递
/**
* 总结:基本类型值的传递只会将值拷贝给方法
value: 1
value: 9
c: 1
*/
int c = 1;
change4(c);
System.out.println("c: " + String.valueOf(c));
public static void change4(int value){
System.out.println("value: " + String.valueOf(value));
value = 9;
System.out.println("value: " + String.valueOf(value));
}
4.方法间的对象值传递
4.1 改变参数变量的属性
/**
* 总结:方法块内能更改外部对象的属性值
* xiaoying内存地址: insert.VariableAddress$Person@10b30a7
person内存地址: insert.VariableAddress$Person@10b30a7
xiaogan内存地址: insert.VariableAddress$Person@10b30a7
person方法内: xiaoying
xiaogan: xiaoying
person方法内: xiaogan
xiaogan: xiaogan
xiaoying方法外: xiaogan
*/
Person xiaoying = new Person("xiaoying");
System.out.println("xiaoying内存地址: " + xiaoying.toString());
change1(xiaoying);
System.out.println("xiaoying方法外: " + xiaoying.getName());
public static void change1(Person person){
System.out.println("person内存地址: " + person.toString());
Person xiaogan = person;
System.out.println("xiaogan内存地址: " + xiaogan.toString());
System.out.println("person方法内: " + person.getName());
System.out.println("xiaogan: " + xiaogan.getName());
xiaogan.setName("xiaogan");
System.out.println("person方法内: " + person.getName());
System.out.println("xiaogan: " + xiaogan.getName());
}
4.2 改变参数变量指向的地址
/**
* 现象:参数对象地址与外部对象地址一致,可是重新给参数赋予新的对象地址,外部对象地址并不会改变
总结:外部对象只是将地址值拷贝一份给了参数变量,参数变量与外部变量无关
* xiaohuang内存地址: insert.VariableAddress$Person@1a758cb
xiaoli内存地址: insert.VariableAddress$Person@1b67f74
person内存地址: insert.VariableAddress$Person@1b67f74
xiaohuang内存地址: insert.VariableAddress$Person@1a758cb
*/
Person xiaohuang = new Person("xiaohuang");
System.out.println("xiaohuang内存地址: " + xiaohuang.toString());
change2(xiaohuang);
System.out.println("xiaohuang内存地址: " + xiaohuang.toString());
public static void change2(Person person){
//将一个新的地址值传给传进来的对象
Person xiaoli = new Person("xiaoli");
System.out.println("xiaoli内存地址: " + xiaoli.toString());
person = xiaoli;
System.out.println("person内存地址: " + xiaoli.toString());
}
4.3 成员变量作为外部变量传参之后,在方法块内更改其地址
/**
总结:成员变量作为参数传入,打印成员变量与参数的内存地址,随机更改成员变量的内存地址,发现参数的内存地址并没有改变
person内存地址: insert.VariableAddress$Person@14318bb
parent内存地址: insert.VariableAddress$Person@14318bb
person内存地址: insert.VariableAddress$Person@14318bb
parent内存地址: insert.VariableAddress$Person@1b67f74
*/
成员变量:
private static Person parent = new VariableAddress.Person("parent");
作为参数传入
change5(parent);
public static void change5(Person person){
System.out.println("person内存地址: " + person.toString());
System.out.println("parent内存地址: " + parent.toString());
parent = new Person("main");
System.out.println("person内存地址: " + person.toString());
System.out.println("parent内存地址: " + parent.toString());
}
网友评论