public static void main(String[] args) {
ArrayList a=null, b=null;
a=b;
a=new ArrayList();
System.out.println(a+""+b);
}
Run Code Online (Sandbox Code Playgroud)
世界上为什么b打印为null?
我认为java引用的引用是相同的,然后你改变的其中一个反映了另一个.但不是在这种情况下!
这一行:
a = b;
Run Code Online (Sandbox Code Playgroud)
将值设置为a当前值b.这是所有它.当前值为bnull,因此它等效于:
a = null;
Run Code Online (Sandbox Code Playgroud)
它不是两个变量关联.它只是将一个值复制到另一个.
改变a之后的值根本不会改变b.这两个变量是完全分开的.请注意,这与原始类型完全相同:
int a = 10;
int b = a;
a = 5;
System.out.println(b); // Prints 10, not 5
Run Code Online (Sandbox Code Playgroud)
即使你有:
ArrayList<String> a = new ArrayList<String>();
ArragList<String> b = a;
a.add("Hello");
System.out.println(b.get(0)); // Prints "Hello"
Run Code Online (Sandbox Code Playgroud)
这仍然没有真正显示变量a和变量之间的关系b.它们具有相同的值,因此它们引用相同的对象(ArrayList自身) - 可以通过任一变量观察对该对象的更改.但是,更改每个变量的值以引用不同的列表(或null)不会影响其他变量或对象本身.
可能让您感到困惑的一件事是实际价值a或b实际价值.Java中的变量(或任何其他表达式)的值永远不是对象 - 它始终是引用值或原始值.
因此,赋值运算符,或者将参数传递给方法,或类似的任何东西都不会复制对象 - 它只会复制表达式的值(引用或原始值).
一旦你理解了这一点,Java开始变得更有意义......