最清晰的理解JAVA参数传递问题

今天来聊一聊java的参数传递问题。

1.基本类型传递
对于:

整型: byte short int long

浮点型 float double

逻辑型 boolean

字符型 char

四类八种基本类型来说,传递的都是值,因为这些值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了.

public static voidmain(String[] args) {int num = 0;

change(num);

System.out.println(num);//输出0

}public static void change(intnumChange){
numChange=5;

}

结构如下图,也因此最外层的num的值并没有受到影响.

在这里插入图片描述

2.对象传递

2.1 例一

对象传递,本质上也都是值传递,只不过传递的值是该引用的拷贝.看下面实例和图解:

public static voidmain(String[] args) {
Person person= new Person(“aaa”, 11);

change(person);

System.out.println(person);//输出 bbb 11

}public static voidchange(Person personChange){
personChange.setName(“bbb”);

}

结构图如下:

当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,即使后面做了set方法修改,但是对两者的执行毫无影响.

在这里插入图片描述

2.2例二

例二和之前的不同之处在change里面,对personChange进行了new操作.代码如下:

public static voidmain(String[] args) {
Person person= new Person(“aaa”, 11);

change(person);

System.out.println(person);//输出 aaa 11

}public static voidchange(Person personChange){
personChange= new Person(“bbb”,12);

}

结构图如下:

当执行change的时候,会把person变量的指向的地址拷贝一份给personChange,两者都指向同一个堆内存,接下new操作会在堆中重新创建一个person对象,此时personChange则指向这个对象,而原person的指向没发生变化,故输出aaa 11.

对象参数传递时候可以把对象的地址看做值来传递,原方法的对象地址是不变的。改变的只是形参的地址值。

在这里插入图片描述

2.3 例三

例三是综合例一和例二,前面两个搞懂的话这个就很容易懂了.

public static voidmain(String[] args) {
Person person= new Person(“aaa”, 11);

change(person);

System.out.println(person);//输出 ccc 11

}public static voidchange(Person personChange){
personChange.setName(“ccc”);

personChange= new Person(“bbb”,12);

}

结构图如下:

读者自己理解下,不懂的话再看看前面的,看看为什么输出CCC 11

在这里插入图片描述

2.4特殊的String

终于到最初的问题,为什么String是对象,但是却不符合上面对象传递测试出来的结果?

public static voidmain(String[] args) {
String str= “11111”;

changeStr(str);

System.out.println(str);//输出11111

}public static voidchangeStr(String str){
str= “22222”;

}

原因:

因为String对象具有不可变性,所以针对操作str = “22222”,在String池中不存在的时候,就是相当于str = new String()。也就是说相当于每当str换一次值的时候都会改变一个地址值。但是原方法的参数的地址是不变的。所以String类型传递时候是跟基本数据类型一样的效果。

3.总结

要理解上面的结果,就要认为Java中只有值传递:

对于基本类型,直接拷贝值传递过去

对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值