一、简介

  final修饰符可以用来修饰变量、方法、类。final修饰变量时一旦被赋值就不可以改变。

二、final成员变量

  成员变量是随类初始化或对象初始化而初始化的。当类初始化的时候,会给类变量分配内存;当对象初始化的时候,会给实例变量分配内存。

  所以说,final修饰的变量可以在申明的时候指定初始值,也可以再静态初始化块中指定初始值;final修饰的实例变量除了在申明的时候指定初始值,还可以在构造器或者在普通初始化块中指定初始值。

  需要注意的是: 指定初始值只能在一处进行,不可既在申明的时候指定,又在初始化块中指定。

  

package fianlFieldCase;

public class Test {

    //实例field,在申明时赋值了
private final String str = "java"; //实例field,在申明时未赋值
private final String str2; //实例field,在申明时未赋值
private final int i; //类field,在申明时赋值了
private static final int i2 = 2; private static final int i3; {
//在普通初始化块中给实例field赋值
str2 = "normalFinalField";
} static
{
//在静态初始化块中给类field指定初始值
i3 = 3;
}
public Test()
{
//在构造器中给实例field赋值
i = 1; //在构造器中给已经在初始化中赋了值的str2重新赋值,将会报编译错。
//str2 = "re";
}
}

  注意: final修饰的成员变量必须显式进行初始化,若与普通成员变量一样,由系统给出默认值,而此变量又是不可变的,那这个变量也就失去意义了。所以JAVA语法规定final修饰的成员变量必须显式初始化。

三、final局部变量

  final修饰的局部变量可以在申明的时候赋值,也可以在后面赋值,但只能赋值一次,否则会编译不通过。同样final修饰的形参也是的,不可以重新进行赋值,因为形参是在该方法被调用的时候被赋值的。  

package fianlFieldCase;

public class FinalField {

    public static void print(final String str)
{
//str不能被重新赋值
//str = "android";
System.out.println(str);
}
public static void main(String[] args) {
//final修饰的局部变量在申明的时候就被初始化了
final String s = "java"; //若重新赋值,便会编译不通过
//s = "python"; //final修饰的局部变量,没有被初始化
final int i; //可以在后面进行初始化
i = 1; //重新赋值,便会报错
//i = 2; print("Ruby");
}
}

四、final修饰基本类型变量和引用类型变量的区别  

  当使用final修饰基本类型变量时,不能对基本类型变量进行重新赋值,因此基本类型变量不能被改变。

  当final修饰引用类型变量时,它仅仅是一个引用,存放的是对象的地址,那这个地址是不能变的,即不能指向新的地址,但指向的这个对象里面的值其实是可以改变的。

  final修饰方法和类将在后续博客进行总结!

【JAVA】final修饰Field的更多相关文章

  1. Java final修饰符

    final的定义: 在英文层面上,final的意思是"最后的","最终的"意思,在Java中也同样表示出此种含义. final的运用对象: final适用于修饰 ...

  2. Java final 修饰符知识点总结

    final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...

  3. Java final修饰形参

    转自:http://java.chinaitlab.com/base/836044.html public class BB{ public int i; } public class PP{ pub ...

  4. java final修饰变量时的一种情况

    有如下一种场景. 1.在文件PaymentConfig.java中存在如下变量public static final desc="描述" 2.类Test.java中使用了desc变 ...

  5. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  6. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  7. JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

    Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...

  8. Java中final修饰的数据

    目录 Java中final修饰的数据 有初始值的final域 final+基本数据类型 final+引用数据类型 final与static final 空白final域 final修饰的参数 基本数据 ...

  9. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

随机推荐

  1. mac linux netstat -n

    一直都不明白为什么mac就是不现实8080端口,现在明白了 USERtekiiMac-3:~ user$ netstat -an | grep tcp46 tcp46 0 0 *.8009 *.* L ...

  2. iOS block并发

    多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单.它把任务分派到不同的queue队列来处理.开发者把任务代码装到一 ...

  3. define定义方法

    define('a',function(){ ; return x; }); define('b',['a'],function(a){ ; return y+a; }); M.use(['b'],f ...

  4. MVC上传文件目录至共享目录

    1.需在共享目录的服务器上加入一个有权限(所有权限,包括读.写.删除等权限)的账号名2.MVC站点webconfig文件中,<system.web>节点中加入配置节点,    <id ...

  5. 10个Visual Studio原生开发调试技巧

    10个Visual Studio原生开发调试技巧(1) 2013-05-29 13:30 佚名 开源中国 我要评论(1) 字号:T | T 以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来 ...

  6. gmt学习资源

    1 http://seisman.info/ http://examples.gmt-china.org/ http://docs.gmt-china.org http://modules.gmt-c ...

  7. .NET解析HTML库集合

    CsQuery AngleSharp Jumony HtmlAgilityPack Fizzler ScrapySharp NSoup

  8. error when loading the sdk 发现了元素 d:skin 开头无效内容

    把devices.xml这个文件删除,再把sdk里面tools\lib下的这个文件复制到你删除的那个目录里.重新启动eclipse

  9. ArrowDrawable

    https://github.com/wly2014/ArrowDrawable https://github.com/ChrisRenke/DrawerArrowDrawable

  10. 《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记

    造成开销的操作包含: 1. 线程之间的协调(比如:锁.触发信号以及内存同步等) 2. 添加�的上下文切换 3. 线程的创建和销毁 4. 线程的调度 一.对性能的思考 1 性能与可伸缩性 执行速度涉及下 ...