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? 提前谢谢。
答案 0 :(得分:1)
Java严格按this question所示的值传递,因此当您将对象作为参数传递给方法时,实际上是将对象地址的副本传递给函数(隐式指针) )。
因此,如果将方法中的值更改为null,则将地址副本的值设置为null,这对实际对象不起作用。
希望这会有所帮助:)
答案 1 :(得分:0)
您的变量b
是参考。
这意味着变量b
中没有对象,只有一个指针指向内存中某个对象可能是或可能不存在的点。
如果您使用b
或b=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的理解。希望这可以提供帮助!