Java中方法调用完之后,原来的数改变吗?

注:此想法来源于刘意老师的Java基础视频,用到的代码和图均出自刘意老师,我只做解释)

附代码:

内存示意图:

1.先讲第一种:基本类型:形式参数的改变对实际参数没有影响

首先在栈中为main方法开辟空间,在其中声明了两个数int a = 10,int a = 20 ,

接着为change(int int )方法开辟内存,并把a,b两个数的值赋给形参

注意:这个时候,change方法中要求输入两个int类型的形参,老师在此出没有写出,应该是change(int x,int y ),然后再将a,b的值在分别赋给x,y,所以最终在change方法的内存中出现的是int a = 10,b=20

紧接着开始执行方法体内的程序,立刻将a变为20,b变为40 .接着将这个结果return回去,change方法就在内存中被回收了,

注意!!!此时,原来的int a 和int b  并没有做任何改变,上面发生的一系列变化,都是在change方法开的内存中进行的

2.再讲第一种:引用类型:形式参数的改变直接影响实际参数。

在main方法中再次开辟内存,创建一个新的变量int[]arr,此时arr是形参,在new一个数组出来时,必须在堆中开辟内存!!用来存放数组中的元素,而这个内存的地址,将他赋值给了arr,,也就是此时arr指向了堆中的一个内存地址。而这个地址中存放着这个数组的各光元素,也就是1,2,3,4,5

接下来,在栈中再次为change(int【】 x)方法开辟内存,这时,将arr的值赋给了x,也就是x也指向了堆中的一块内存,在内存图中写的就是0x0001

此时开始执行change(int[] x)的方法体,而此时是在堆中进行的操作!!!因为此时栈内存中存储的仅仅是一个地址值而已!要想进行方法体内的操作,必须到堆中进行!!!紧接着会将数组中的元素改变!!

在change方法执行完了之后,他的内存就被回收了,不返回值,但是此时数组中的值已经被改变了!!!(无情!!!改了人家的数后,自己溜了!!)而且arr指向的还是那个内存地址,此时这个地址中的值已经变了,所以这个时候在输出的话,int[]arr就不再是{1,2,3,4,5}而是{1,4,3,8,5}

这就是所谓的,引用类型:形式参数的改变直接影响实际参数。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的Condition类是Java多线程编程一个重要概念,它提供了类似于Object类的wait()、notify()和notifyAll()方法的功能,并且更加灵活和强大。Condition.await()方法是Condition类一个实例方法,用于线程等待某个条件的发生。 当线程调用Condition.await()方法时,它释放它所持有的锁,并且进入等待状态,直到其他线程调用相同的Condition对象上的signal()方法或signalAll()方法来唤醒它。与Object.wait()方法不同的是,Condition.await()方法可以选择性地等待某个特定条件的发生,而不是简单地等待任意条件的发生。 Condition.await()方法的使用需要与锁配合使用,通常的做法是在获取锁之后调用Condition.await()方法,然后在条件满足时调用Condition.signal()或Condition.signalAll()方法来唤醒等待的线程。具体流程如下: 1. 获取锁。 2. 如果条件不满足,调用Condition.await()方法,线程进入等待状态。 3. 如果条件满足,执行相应的操作。 4. 调用Condition.signal()或Condition.signalAll()方法,唤醒等待的线程。 5. 释放锁。 需要注意的是,Condition.await()方法可能出现虚假唤醒的情况,因此在使用时应该总是在循环调用Condition.await()方法,并在循环检查条件是否满足。例如: ``` final Lock lock = new ReentrantLock(); final Condition condition = lock.newCondition(); // 线程1 lock.lock(); try { while (!conditionSatisfied) { condition.await(); } // 执行相应的操作 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } // 线程2 lock.lock(); try { conditionSatisfied = true; condition.signal(); } finally { lock.unlock(); } ``` 在这个例子,线程1在获取锁之后调用Condition.await()方法等待条件满足,线程2在获取锁之后改变条件状态并调用Condition.signal()方法唤醒等待的线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值