【JAVA】final修饰Field
一、简介
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的更多相关文章
- Java final修饰符
final的定义: 在英文层面上,final的意思是"最后的","最终的"意思,在Java中也同样表示出此种含义. final的运用对象: final适用于修饰 ...
- Java final 修饰符知识点总结
final从字面上理解含义为“最后的,最终的”.在Java中也同样表示出此种含义. final可以用来修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. 1. fin ...
- Java final修饰形参
转自:http://java.chinaitlab.com/base/836044.html public class BB{ public int i; } public class PP{ pub ...
- java final修饰变量时的一种情况
有如下一种场景. 1.在文件PaymentConfig.java中存在如下变量public static final desc="描述" 2.类Test.java中使用了desc变 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和mu ...
- Java中final修饰的数据
目录 Java中final修饰的数据 有初始值的final域 final+基本数据类型 final+引用数据类型 final与static final 空白final域 final修饰的参数 基本数据 ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
随机推荐
- mac linux netstat -n
一直都不明白为什么mac就是不现实8080端口,现在明白了 USERtekiiMac-3:~ user$ netstat -an | grep tcp46 tcp46 0 0 *.8009 *.* L ...
- iOS block并发
多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单.它把任务分派到不同的queue队列来处理.开发者把任务代码装到一 ...
- define定义方法
define('a',function(){ ; return x; }); define('b',['a'],function(a){ ; return y+a; }); M.use(['b'],f ...
- MVC上传文件目录至共享目录
1.需在共享目录的服务器上加入一个有权限(所有权限,包括读.写.删除等权限)的账号名2.MVC站点webconfig文件中,<system.web>节点中加入配置节点, <id ...
- 10个Visual Studio原生开发调试技巧
10个Visual Studio原生开发调试技巧(1) 2013-05-29 13:30 佚名 开源中国 我要评论(1) 字号:T | T 以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来 ...
- gmt学习资源
1 http://seisman.info/ http://examples.gmt-china.org/ http://docs.gmt-china.org http://modules.gmt-c ...
- .NET解析HTML库集合
CsQuery AngleSharp Jumony HtmlAgilityPack Fizzler ScrapySharp NSoup
- error when loading the sdk 发现了元素 d:skin 开头无效内容
把devices.xml这个文件删除,再把sdk里面tools\lib下的这个文件复制到你删除的那个目录里.重新启动eclipse
- ArrowDrawable
https://github.com/wly2014/ArrowDrawable https://github.com/ChrisRenke/DrawerArrowDrawable
- 《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记
造成开销的操作包含: 1. 线程之间的协调(比如:锁.触发信号以及内存同步等) 2. 添加�的上下文切换 3. 线程的创建和销毁 4. 线程的调度 一.对性能的思考 1 性能与可伸缩性 执行速度涉及下 ...