成员方法传参机制

public class test{
 public static void main(String[] args){
 int a = 10;
 int b = 20;
 AA obj = new AA();//在堆中开辟一个新对象空间
 obj.swap(a, b);//调用swap方法,在栈中开辟一个独立的栈来执行swap方法语句
Systme.out.println(a + b);//输出最后一句 10 20
 }
}
class AA{
pblic void swap(int a,int b){//main栈传进来的a,b的值赋给了swap栈的a,b
System.out.println(a + b);//输出传进来的 a b 值分别为10 20
int temp = a;//进行参数值的调换
a = b;
b = temp;
System.out.println(a + b);//输出调换之后的值 20 10,到此swap方法执行结束,回到main栈
 }
}

 

基本数据类型,传递的是值,在swap栈开辟并在main栈中传入的a,b的值,传入的是a,b的值,当swap栈中a,b的值改变时,并不会影响main栈中的值,因为传过去的是值而不是地址。

public class MethodParameter{
public static void main(String[] args){
B b = new B();//在堆中开辟一个新的空间
int[] a = {1,2,3};
b.best100(arr);//调用best100方法,会在栈中建立一个新栈,并执行best100方法
for(int i = 0; i < arr.lenght; i++){
System.out.print(arr[i]);//200 2 3
}
System.out.println();
 }
}
class B{
 public void test100(int[] arr){//将main中的数组传进来,传进来的是地址,现在这main栈与test100栈中的数组全都指向堆中同一个数组的地址
 arr[0] = 200;
for(int i = 0; i < arr.lenght; i++){
System.out.print(arr[i]);//100 2 3
}
System.out.prinntln();
}

 

关键点:数组为引用类型,将main中数组传入方法中时,传的不是数组中的值,而是数组中的地址,所以无论是mian栈中还是test100栈中都会指向同一个数组,无论谁改变都会引起改变。

public class MethodParameter{
public static void main(String[] args){
Person p = new Person();//在堆中开辟一个空间,建立一个新对象
p.name = "jack";//String型在方法去存放,被堆中的一个地址指向
p.age = 10;//基本类型在直接在堆中存放
b.test200(p);//使用test200方法,开辟test200栈,并运行其方法的内容
System.out.println(p.age);//10
 }
}
class Person{
String name;
int age;
}
class B{
public void test200(Person p){//刚把p在main栈传进来这时test200栈中的p与其都指向同一个对象
p = new Person();//给在test200 栈中的p新建了一个对象在堆中开辟了一个新的空间,并指向这个空间
p.name = "Tom";//这些都在test200栈中所以会将其填入其开辟的新对象空间
p.age = 99;
}

 

关键点:在于test200栈中 p = new Person() 这条语句,这代表为test200栈中的对象在堆中开辟了新的空间,再改变值时也只是改变自己堆空间里的对象,影响不到main栈中对象的值。

注:文章中部分图片出自韩顺平老师,如有侵权联系我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值