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