我编写了以下代码:
class Numbers
{
int temp,a1,b1;
void swapping(){
temp = a1;
a1 = b1;
b1 = temp;
System.out.println("In numbers class value of a after swapping ="+a1 + " and that of b=" + b1);
}
}public class Swap{
public static void main(String[] args) {
int a=2;
int b=3;
System.out.println("In swapping class value of a before swapping ="+a + " and that of b=" + b);
Numbers num = new Numbers();
num.a1= a;
num.b1= b;
num.swapping();
System.out.println("In swapping class value of a after swapping ="+a + " and that of b=" + b);
}
}现在,在void ()中的a1和b1的值与在a1和b1上实现交换操作之后的虚拟println语句相同。这与调用交换函数之前在主函数中打印的值相同。但是,函数调用后的main函数中的println语句显示了交换的值。假设由于Java编译器中一些不可预见的异常而存储了一些垃圾值,而不是交换值,那么如何将其更改为所需的任何值?
发布于 2022-06-09 05:50:10
这里的诀窍是理解Java有两个并行的类型系统
在您的代码中:
num.a1 = a;…您正在从a复制2的数量,并将该数量放入a1中。在执行该语句之后,a和a1是独立的。它们是两个独立的数字,两个独立的值,彼此不知道。这是因为他们是原始人。
在您的代码中:
Numbers num = new Numbers(); …你换了OOP类型的系统。这里实例化了一个Numbers对象,这意味着您在其他地方抓取了一段内存,在该内存中为该类中定义的三个原语开辟了空间。您还为类定义中存在的名为swapping的方法的实现开辟了参考空间。
从内存中浮动的实例化Numbers对象到名为num的局部变量进行引用(或链接或指针)。
当您调用swapping方法时,该代码处理存储在对象中的a1和b1原语值。该代码不知道存在于对象之外的a和b变量,这些变量仅在main方法中本地存在。
因此,在swapping代码完成后,您可以将JVM中的内存想象成如下图所示。交换后,a和b变量将保持原来的状态,不受任何影响。只触及a1和b1变量(和temp)。

因此,单独作用域中的代码可以共享对同一个对象的引用。但是,单独作用域中的代码不能共享完全相同的原始变量,它们只能获得另一个原始变量的值的副本。
发布于 2022-06-09 04:40:51
System.out.println("In swapping class value of a after swapping ="+a + " and that of b=" + b);您只是在这里打印a和b变量。因为在swap类中的任何地方都没有重新分配a和b。将代码更改为打印num.a1和num.b1,您将看到num对象的值已更改。
https://stackoverflow.com/questions/72554746
复制相似问题