final 变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是== final 对象里的数据可以被改变==。也就是说 final 对象的引用不能改变,但是里面的值可以改变。
说实话,刚开始学习final我以为是c++的引用那种,但是后来发现就是个常量指针,指向一个固定区域的对象.由于java没有指针这个概念,因此无法修改对象,只能通过创建新的对象而修改指向,而final修饰符指向的这个对象,这个指向无法修改.
但是我看到一个博客上面写的,其实也不是没有办法修改这个指向,绕开编译器就好:
传送门在此,不想粘贴人家的代码
大概就是从内存的地址出发,假如final修饰的对象是包装类这种不是简单的数据类型,那么引用的时候找出类的地址,然后创建一个别的对象,或者说相同的类型的对象(不知道能不能放不同类型的,但是我感觉不同类型会报错,因为内存访问的时候容易发生非法越界,java那么安全应该会考虑这个),从根源上修改地址数值,从而绕开编译器做到了修改指向对象这个操作.
自己的理解,可能有错,欢迎指正.
final修饰的变量应该包含两个地址,一个是自己成员变量创建的地址,一个是指向引用对象的指针的地址;然后可以直接去修改后者的地址字段,从而在外部看来,就发生了引用但是数据修改.说实话,可以理解为引用(c++的),但是子啊final修饰变量指向常量池时,跟const也蛮像的.
继续学习,努力摆脱我的菜狗~