final修饰的对象咋办?

上代码 ` private static final Logger logger = LoggerFactory.getLogger(ThreadTest.class);

public void test_1(final AuthorizeContractBean bean){
    new Thread(new Runnable() {
        [@Override](https://my.oschina.net/u/1162528)
        public void run() {
            bean.setBorrowerId("1");
            logger.info(bean.toString());
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();

}
[@Test](https://my.oschina.net/azibug)
public void test_2(){
    for (int i = 0; i < 1000; i++) {
        AuthorizeContractBean b = new AuthorizeContractBean();
        if(i % 2 == 0){
            b.setPlatformNo("aaa");
            b.setFileUrl("aaa-url");
            test_1(b);
        } else {
            b.setPlatformNo("bbbb");
            b.setFileUrl("bbb-url");
            test_1(b);
        }
    }
}`

最终输出结果


17:43:43.077 [Thread-5] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.075 [Thread-2] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.077 [Thread-4] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.077 [Thread-3] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.075 [Thread-1] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.077 [Thread-6] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.078 [Thread-7] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.079 [Thread-8] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.079 [Thread-9] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.079 [Thread-10] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.079 [Thread-11] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}
17:43:43.079 [Thread-12] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='bbb-url', platformNo='bbbb'}
17:43:43.079 [Thread-13] INFO  c.i.ups.app.contract.Test.ThreadTest - AuthorizeContractBean{borrowerId='1', fileUrl='aaa-url', platformNo='aaa'}

说明bean对象的值是可以被改变的。

但是bean不能被重新指向别的引用。 示例图

总结:final修饰的对象,引用不可被改变,但对象内的值可以被改变。但普通变量只能赋值一次。 参考网址:输入链接说明

转载于:https://my.oschina.net/u/2301293/blog/1799877

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,类的成员变量使用`final`修饰和方法中的参数使用`final`修饰有以下区别: 1. 类的成员变量使用`final`修饰: - `final`修饰的成员变量表示该变量是一个常量,一旦被赋值后就不能再修改。 - `final`成员变量必须在声明时或构造函数中进行初始化,且不能再被赋新值。 - `final`成员变量在整个类的生命周期中保持不变,具有只读的特性。 2. 方法中的参数使用`final`修饰: - `final`修饰的方法参数表示该参数在方法内部不能再被修改。 - `final`参数主要用于保护方法内的参数值不被修改,一旦参数被赋值后,在方法中不能修改其值,避免了不经意间修改参数的风险。 - `final`参数通常用于提高代码的可读性和安全性。 一般情况下,对类的成员变量使用`final`修饰的情况包括: - 常量:当一个变量在整个类中都不应该被修改时,可以使用`final`修饰,使其成为一个常量。 - 线程安全:当多个线程访问同一个对象时,通过将共享的成员变量声明为`final`可以确保其在多线程环境下的安全性。 - 优化性能:编译器对`final`变量进行优化,可以提高程序的执行效率。 而对方法中的参数使用`final`修饰的情况包括: - 明确参数只用于读取,不应该被修改。 - 提高代码可读性,使方法的行为更加明确和可预测。 - 防止不经意间修改参数值,确保方法逻辑正确性和稳定性。 需要注意的是,使用`final`修饰并不是必须的,而是根据具体情况来考虑是否需要使用`final`来增加代码的可读性、安全性和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值