在java中,如果使用引用调用,我可以更改值,为什么可以';我不能把它设为空吗

在java中,如果使用引用调用,我可以更改值,为什么可以';我不能把它设为空吗,java,Java,大家好,我在stackoverflow上读了一些关于java是否按值调用的问题,然后我想尝试一下。 如果使用引用,我可以对值进行更改…为什么不能将其设置为null? 提前感谢。Java严格按值传递,如所示,因此当您将对象作为参数传递给方法时,实际上是将对象地址的副本传递给函数(隐式指针) 因此,如果将方法中的值更改为null,则将地址副本的值设置为null,这与实际对象无关 希望这有帮助:)您的变量b是一个参考。 这意味着变量b中没有对象,只有一个指向内存中某个点的指针,该点可能是对象,也可能不

大家好,我在stackoverflow上读了一些关于java是否按值调用的问题,然后我想尝试一下。 如果使用引用,我可以对值进行更改…为什么不能将其设置为null?
提前感谢。

Java严格按值传递,如所示,因此当您将对象作为参数传递给方法时,实际上是将对象地址的副本传递给函数(隐式指针)

因此,如果将方法中的值更改为null,则将地址副本的值设置为null,这与实际对象无关


希望这有帮助:)

您的变量
b
是一个参考。 这意味着变量
b
中没有对象,只有一个指向内存中某个点的指针,该点可能是对象,也可能不是对象

如果将变量
b
设置为
b=null
b=任何对象更改变量
b
。然后它将指向不同的内容(或者在
b=null;
为nothing的情况下)

如果
b
指向某个对象,您可以使用
b
作为它指向的任何对象的替代。 So
b.setA(30)b
指向具有该方法的对象,示例中的code>就可以工作,因为程序将查找
b
指向的对象并调用该方法

作为旁注: 正因为如此,我们得到了称为
NullPointerExceptions
的小东西。因为如果
b
为null,那么您正试图调用一个不存在的方法
b
只是不指向具有该方法的对象,因此您会得到该异常。

class TestClass{
class TestClass {
public static void main(String... args) {
    Bean b=new Bean();
    b.setA(10);
    b.setB(20);

    changeValue(b);

    System.out.println("A "+b.getA());
    System.out.println("B "+b.getB());

}


static void changeValue(Bean b)
{
    b.setA(30);
    b.setB(40);
    b=null;
}}
公共静态void main(字符串…参数){ Bean b=new Bean();//示例:声明存储在堆栈中的b(1),并指向堆中的地址XXX b、 setA(10);//将值设置为XXX b、 setB(20);//将值设置为XXX changeValue(b);//在堆栈中声明b(2),它还指向XXX System.out.println(“A”+b.getA());//从XXX获取 System.out.println(“B”+B.getB());//从XXX获取 }
静态无效值(Bean b)//是的,但请通读说明。。这有点超出了说明的范围。但是当我更改值时,那么什么。。它不应该只在该副本中进行更改吗?什么副本?您收到的是对原始对象的引用的副本。@ManishNegi没有对象的副本,而是对原始对象的引用的副本,如@EJP in指示,因此当您进行更改时,例如调用
setA()
setB()时
然后它们将按预期工作,因为在该阶段,您在b中有正确的地址,但是当您将b更改为null时,它不再指向该对象。请看,这就是我没有得到任何异常的点,而不是打印值A=30和b=40,就像我说的,只要b指向一个对象,您就不会得到异常。哟然而,如果你在你做了
b=null;
之后试图调用
b.setA(30);
你会得到一个。一段代码并不代表对任何东西的理解。你必须解释。他问:“但是当我更改值时,它应该只更改该副本吗?”,所以我想他不知道原件和复印件之间有什么区别,我对他的代码块进行了评论,描述了它们如何在堆栈和堆内存中工作。代码中的注释是无用的。一开始实际上是看不见的。你需要在问题的主体部分进行解释。
class TestClass {
public static void main(String... args) {
    Bean b=new Bean(); //example: declare b(1) stored in stack and pointed to address XXX in heap
    b.setA(10); // set value to XXX
    b.setB(20); // set value to XXX

    changeValue(b); // declare b(2) in stack and it also point to XXX

    System.out.println("A "+b.getA()); // get from XXX
    System.out.println("B "+b.getB()); // get from XXX

}


static void changeValue(Bean b) //<---this is b(2)
{
    b.setA(30); // set value to XXX
    b.setB(40); // set value to XXX
    b=null; // this just means b(2) don't point to anywhere in heap, no changes in XXX and b(1)
}}