栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java类中final修饰的成员变量被修改的情况

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java类中final修饰的成员变量被修改的情况

package Learning;

import java.util.Date;

public class ClassDemo {
    private String sss;
    private Date d;
    public ClassDemo(String sss) {
        this.sss = sss;
    }

    public String getSss() {
        return sss;
    }

    public ClassDemo(String sss, Date d) {
        this.sss = sss;
        this.d = d;
    }

    public Date getD() {
        return d;
    }

    public static void main(String[] args) {
        ClassDemo c=new ClassDemo("asd",new Date());
        System.out.println(c.d);
        Date s=c.getD();
        s.setTime(1212123123);
        System.out.println(c.d);
    }
}


根据上图可以发现对象中的数据被修改了,但是代码中并没有修改器方法,只有访问器方法,那么问题出在了哪里?
由于getD返回的方法是一个引用可变对象,这导致了类外部的一个Date类也拥有了管理类内部数据的渠道,也就是这个外部的Date类指向了类内部的成员,而这时对内外部的数据进行修改也会同时修改类内部的数据,因此请不要编写返回引用可变对象的访问器方法。
当然,如果一定要返回一个可变对象的引用,那么应该先对它进行克隆,对象clone是指存放在另一个位置上的对象副本。
修改后的getD代码如下:

    public Date getD() {
        return (Date)d.clone();
    }


可以发现修改外部Date对象并没有导致类内对象的数据被修改。
当然,对于这种返回引用的方法,即使我们将成员变量设置为final类型,也依旧会使得其指向的数据改变。这是由于final修饰的成员变量只是使得它修饰的成员对象不能再次指向其他的位置,也就是不能指向另一个Date类对象,但是如果对原有的Date类对象进行了修改那么依旧可以使得final修饰的成员变量被修改。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号