黑马程序员技术交流社区

标题: 不是说被final修饰的值不能被改变么为什么这个还能改? [打印本页]

作者: yaolv7    时间: 2016-4-9 22:32
标题: 不是说被final修饰的值不能被改变么为什么这个还能改?
public class Test2 {

        public static void main(String[] args) {
                final Person_1 p = new Person_1("张三");
                System.out.println(p.name);
                p.name = "李四";
                System.out.println(p.name);
        }
}
class Person_1 {
        String name;

        public Person_1() {
                super();
               
        }

        public Person_1(String name) {
                this.name = name;
        }
}
作者: 15281616180    时间: 2016-4-9 22:37
final修饰的是你创建的对象,这个对象的生命周期改变了,
而改变的是该对象的属性值

你想要拿个属性值一直不变的话,就要用final去修饰对应的成员变量
作者: 兵蜂    时间: 2016-4-9 22:43
final修饰的是引用变量p,也就意味着p的值(地址值)是不可变的,而属性没有被final修饰,所以可变
作者: lmr1096200234    时间: 2016-4-9 23:43
上边说的对
作者: 晴苑    时间: 2016-4-9 23:55
楼上解释的已经很清楚了
作者: yc01    时间: 2016-4-9 23:59
有了 深刻理解
作者: Feboam    时间: 2016-4-10 00:08
楼主 呀 要有备注 呀 这样才好呀
作者: Feboam    时间: 2016-4-10 00:10
我居然看到你了  缘分呀楼主
楼主提着问题 我懂滴  大家多不容易呀  
作者: leiothrixs    时间: 2016-4-10 00:52
要了解final 修饰类 ,修饰方法,修饰变量的区别
作者: huhemingtiancai    时间: 2016-4-10 01:00
当他修饰引用数据类型时,他的地址值不可以改变,但是引用数据类型的属性是可以变化的,你试试吧那个p的地址变一下或者改为null,应该是不可以的
作者: 性感不是骚    时间: 2016-4-10 01:22
只是说被final修饰的变量不能改变,是常量
作者: NB的笨小孩    时间: 2016-4-10 07:12
上面分析的很对了
作者: suen530    时间: 2016-4-10 08:39
分析非常好
作者: kcufow    时间: 2016-4-10 09:00
被final修饰的变量要分为引用类型和基本类型,修饰基本类型时该基本类型变量就等于常量了不能重新赋值,修饰的是引用类型时是该引用类型的地址值不能修改即不能改给它赋值一个new对象。
作者: 「AτS」    时间: 2016-4-10 09:29
final Person_1 p = new Person_1("张三"); 这个final 修饰的是p ,p里面放的是Person_1("张三")这个对象在堆中的地址, 其实是p 所指向的地址值不能改变了,
p.name = "李四"; 这个语句是将堆里面的对象, 也即是Person_1("张三")里面的一个属性值改变了,这个动作是不会改变这个对象在堆中的地址值的,所以p 指向的地址值是没有改变的,因此不会有错.
作者: 张雄    时间: 2016-4-10 12:49
在刘意老师的基础视频的第12天会有专门的讲解,推荐你去看一看。
作者: 白龙马大魔王    时间: 2016-4-10 14:57
大家总结的都很好,借鉴借鉴
作者: IT小笨鸟    时间: 2016-4-10 15:54
这里final修饰的只是p这个引用变量,而不是p对应的属性,所以p的属性name可以改




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2