java - 当你创建一个引用=另一个引用并且两个值都为空时?

标签 java null

public static void main(String[] args) {
        ArrayList a=null, b=null;
        a=b;

        a=new ArrayList();
        System.out.println(a+""+b);
    }

为什么 b 被打印为 null ?

我认为java使引用相同,那么无论你在其中一个引用中进行什么更改都会反射(reflect)另一个引用。但在这种情况下不行!!!

最佳答案

这一行:

a = b;

a 的值设置为b 的当前值。这就是它所做的全部b 的当前值为 null,因此相当于:

a = null;

关联这两个变量。它只是将一个的值复制到另一个。

之后更改a的值不会改变b。这两个变量是完全独立的。请注意,这对于原始类型完全相同:

int a = 10;
int b = a;
a = 5;
System.out.println(b); // Prints 10, not 5

即使你有:

ArrayList<String> a = new ArrayList<String>();
ArragList<String> b = a;
a.add("Hello");
System.out.println(b.get(0)); // Prints "Hello"

仍然没有真正显示变量ab之间的关系。它们具有相同的值,因此它们引用相同的对象(ArrayList 本身) - 可以通过任一变量观察对该对象的更改。但是更改每个变量的以引用不同的列表(或 null)不会影响其他变量或对象本身。

可能让您感到困惑的一件事是 ab 的实际值是什么。 Java 中变量(或任何其他表达式)的值从来都不是对象 - 它始终是引用或原始值。

因此,赋值运算符,或将参数传递给方法,或类似的东西永远不会复制对象 - 它只会复制表达式的值(引用或原始值)。

一旦你理解了这一点,Java 就开始变得更有意义了......

关于java - 当你创建一个引用=另一个引用并且两个值都为空时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940320/

相关文章:

java - Java Crypto JCA Provider 真的需要 windows dll 吗?

java - 在 UWP C++ 应用程序中生成 JVM 时崩溃

java - 从 xml 中提取标签的值,其中 xml 消息以字符串形式出现

java - 停止不包含 while 语句的线程

mysql - mysql 数据库中如何以编程方式实现 Null 值?

Perl 5.8 级联空检查

java - java中的异常或null

c - NULL 是什么类型?

perl - 如何在 Perl 中为未定义的值打印文字 'null'?

java - 使用 AWS Java SDK 获取 CloudWatch 指标时设置了空数据点?