在java中,如果使用引用调用,我可以更改值,为什么不能将它设置为null

时间:2017-04-21 09:13:47

标签: java

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;
}}

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

3 个答案:

答案 0 :(得分:1)

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

因此,如果将方法中的值更改为null,则将地址副本的值设置为null,这对实际对象不起作用。

希望这会有所帮助:)

答案 1 :(得分:0)

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

如果您使用bb=null;设置变量b=whateverObject;,则更改变量b。然后它将指向不同的东西(或b=null;为空的情况)。

如果b指向某个内容,您可以使用b作为其所指向的内容。 因此,只要b.setA(30);指向具有该方法的对象,您的示例中的b就会起作用,因为您的程序会查找b指向的内容并调用该方法。

作为旁注: 因此,我们得到了一些名为NullPointerExceptions的小东西。因为如果b为null,那么您正在尝试调用不存在的方法。 b根本没有指向具有该方法的对象,因此您得到该异常。

答案 2 :(得分:0)

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)
}}

请阅读上述代码块的评论。这是我对传递java的理解。希望这可以提供帮助!