验证java引用的小例子

java

1. 声明一个变量person指向一个引用对象,

    然后将这个person添加到集合list中,

 然后将变量person指向null,

 问:list中添加的person变成null了吗?

import java.util.ArrayList;

import java.util.List;

public class TestRef {

public static void main(String[] args) {

Person p = new Person("张三");

List<Person> list = new ArrayList<Person>();

list.add(p);

p = null;

for (Person person : list) {

System.out.println(person); // Person [name=张三]

}

}

}

class Person {

private String name;

public Person(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Person [name=" + name + "]";

}

}

View Code

 测试发现:虽然person变量指向了空,list中添加的person并没有变成空。

2. 声明一个变量person指向一个引用对象,

 然后将这个person添加到集合list中,

 然后改变person的属性值,

 问:list中添加的person的属性值改变了吗?

import java.util.ArrayList;

import java.util.List;

public class TestRef {

public static void main(String[] args) {

Person p = new Person("张三");

List<Person> list = new ArrayList<Person>();

list.add(p);

p.setName("李四");

for (Person person : list) {

System.out.println(person); // Person [name=李四]

}

}

}

class Person {

private String name;

public Person(String name) {

super();

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Person [name=" + name + "]";

}

}

View Code

 测试发现:变量person的属性值改变的时候,list中添加的person的属性也同时改变了。

 解释:

    list集合中加入一个person的引用对象时,是直接指向了堆中的被引用的对象,和栈中的原来的那个person变量已经没有直接关系了,但是他们仍然指向堆中的同一个对象。

    当原来的那个person变量指向了别的地方(比如null)的时候,堆中的被引用的对象并没有被改变,list集合中的引用并没有受到影响。

    当原来的那个person变量的属性值改变时,其实是改变了堆中被引用的对象的属性值。而这个对象同时也被list集合引用了,所以list集合中的对象属性值也会改变。

以上是 验证java引用的小例子 的全部内容, 来源链接: utcz.com/z/390969.html

回到顶部