java final关键字到底修饰了什么

原创 2016年05月31日 06:33:23
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。 
版权声明:本文为芝麻软件工作室原创文章,未经芝麻软件工作室允许不得转载。

Java final关键字用来修饰类、方法、属性

1.final修饰类:这个类不能被继承。如:String类、StringBuffer类、System类。 2.final修饰方法:不能被重写。如:Object类的getClass()方法。 3.f...
  • u013453970
  • u013453970
  • 2015年08月12日 20:50
  • 5761

面向对象_final关键字修饰局部变量

/* 面试题:final修饰局部变量的问题 基本类型:基本类型的值不能发生改变 引用类型:引用类型的地址值不能生改变,但是,该对象的堆内存的值是可以改变的。 */ class Stude...
  • L1585931143
  • L1585931143
  • 2016年10月04日 14:23
  • 1474

final修饰符的三种使用场景

final有三种使用场景,分别是修饰变量、方法和类,无论哪种修饰,一旦声明为final类型,你将不能改变这个引用了,编译器会检查代码,如果你试图再次初始化,编译器会报错。下面我来具体说说每一种修饰场景...
  • fuyuwei2015
  • fuyuwei2015
  • 2015年07月14日 17:40
  • 1379

请问在java中定义字符串时要加上final修饰吗?

提问者采纳 亲,final 加到属性上面就是常量了,也就是说他不能变了。String这个类他本身就是final的,所以你定义字符串不须要加,除非你要把这个String变量弄成常量。正...
  • xuchuangqi
  • xuchuangqi
  • 2016年07月18日 21:38
  • 977

java中final关键字到底修饰了什么

1
  • fsz9065
  • fsz9065
  • 2014年06月26日 20:03
  • 361

Java final 关键字到底修饰了什么?

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。 引用本身的不变: final StringBuffer a=...
  • u014143369
  • u014143369
  • 2016年10月19日 20:46
  • 116

final修饰的变量是引用不能改变还是引用的对象不能改变

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。...
  • i_am_tomato
  • i_am_tomato
  • 2015年07月05日 11:12
  • 10110

java 内存分配 final关键字

1. java中内存的分配 java程序在运行时,内存结构分为:方法区(method),栈内存(stack),堆内存(heap),本地方法栈(java中的jni调用)等。 jvm为每一个运...
  • chengzhezhijian
  • chengzhezhijian
  • 2014年02月24日 21:50
  • 1305

面试题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

/* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以...
  • u012110719
  • u012110719
  • 2015年06月02日 20:10
  • 7779

在Java中,final修饰的类有什么特点

关于Java中的final(2010-09-09 14:19:48)转载▼标签: javafinal 分类: Java知识学习 Java中的final共有三种用法: final成员变量 当你在...
  • u010601729
  • u010601729
  • 2014年08月06日 20:10
  • 737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java final关键字到底修饰了什么
举报原因:
原因补充:

(最多只允许输入30个字)