• 验证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集合中的对象属性值也会改变。

  • 相关阅读:
    FineReport图表、参数、填报、决策报表制作
    FineReport入门
    python时间计算:当天、前一天、月初、月末、季初、季末、半年初、半年末、年初、年末
    授予mysql的其他用户数据库的使用权限
    Python日志记录
    JStorm:概念与编程模型
    ftp传输图片损坏原因
    web应用中浏览器与服务端的编码和解码
    Http协议中的CharacterEncoding、Content-Encoding和Transfer-Encoding
    设计模式心法之单一职责原
  • 原文地址:https://www.cnblogs.com/zj0208/p/7340097.html
Copyright © 2020-2023  润新知