A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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;
        }
}

17 个回复

倒序浏览
final修饰的是你创建的对象,这个对象的生命周期改变了,
而改变的是该对象的属性值

你想要拿个属性值一直不变的话,就要用final去修饰对应的成员变量
回复 使用道具 举报
final修饰的是引用变量p,也就意味着p的值(地址值)是不可变的,而属性没有被final修饰,所以可变
回复 使用道具 举报
上边说的对
回复 使用道具 举报
楼上解释的已经很清楚了
回复 使用道具 举报
有了 深刻理解
回复 使用道具 举报
Feboam 中级黑马 2016-4-10 00:08:23
7#
楼主 呀 要有备注 呀 这样才好呀
回复 使用道具 举报
Feboam 中级黑马 2016-4-10 00:10:03
8#
我居然看到你了  缘分呀楼主
楼主提着问题 我懂滴  大家多不容易呀  
回复 使用道具 举报
要了解final 修饰类 ,修饰方法,修饰变量的区别
回复 使用道具 举报
huhemingtiancai 来自手机 中级黑马 2016-4-10 01:00:27
10#
当他修饰引用数据类型时,他的地址值不可以改变,但是引用数据类型的属性是可以变化的,你试试吧那个p的地址变一下或者改为null,应该是不可以的
回复 使用道具 举报
只是说被final修饰的变量不能改变,是常量
回复 使用道具 举报
上面分析的很对了
回复 使用道具 举报
suen530 来自手机 中级黑马 2016-4-10 08:39:03
13#
分析非常好
回复 使用道具 举报
被final修饰的变量要分为引用类型和基本类型,修饰基本类型时该基本类型变量就等于常量了不能重新赋值,修饰的是引用类型时是该引用类型的地址值不能修改即不能改给它赋值一个new对象。
回复 使用道具 举报
final Person_1 p = new Person_1("张三"); 这个final 修饰的是p ,p里面放的是Person_1("张三")这个对象在堆中的地址, 其实是p 所指向的地址值不能改变了,
p.name = "李四"; 这个语句是将堆里面的对象, 也即是Person_1("张三")里面的一个属性值改变了,这个动作是不会改变这个对象在堆中的地址值的,所以p 指向的地址值是没有改变的,因此不会有错.
回复 使用道具 举报
在刘意老师的基础视频的第12天会有专门的讲解,推荐你去看一看。
回复 使用道具 举报
大家总结的都很好,借鉴借鉴
回复 使用道具 举报
这里final修饰的只是p这个引用变量,而不是p对应的属性,所以p的属性name可以改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马