final 主要应用于两个方面:编译器常量,运行期常量(运行期初始化后不再改变).
主要应用场景:
1.final 基本数据:编译器常量
2.final对象引用:仅保持引用不变,引用的对象的具体属性等可以改变[对arr与string适用]
3.空白final:定义的时候未赋值,则使用前必须赋值,且必须在构造方法中赋值.
4.final参数:如果参数基本类型,则值不能改变,如果参数为引用,则引用不能改变
5.final方法:不能被子类重写(非重载),一定情况下,内嵌函数,提升性能
6.final类:不能为继承,不可变设计模式
7.特殊情况: 反射方法可以更改final,但是仅限于空白final的情况,具体测试如下:。
当final定义时,未赋值的时候,可以改变值。
public class Tests{
final int x;
public Tests(){
x=2;
}
public static void changeFieldByReflect(Tests t) throws Exception {
Class clazz = t.getClass();
Field fieldX = clazz.getDeclaredField("x");
fieldX.setAccessible(true);
fieldX.setInt(t, 500);
System.out.println("chage x vlaue by reflect is " + fieldX.getInt(t));
}
public static void getFieldByReflect(Tests t) throws Exception{
Class clazz = t.getClass();
Field fieldX = clazz.getDeclaredField("x");
fieldX.setAccessible(true);
System.out.println("get x vlaue by reflect is " + fieldX.getInt(t));
}
public static void main(String[] args) throws Exception {
System.out.println("////////////---对象 t");
Tests t = new Tests();
System.out.println("x filed is "+t.x);
Tests.changeFieldByReflect(t);
System.out.println("get x value by normal is "+t.x);
Tests.getFieldByReflect(t);
System.out.println("////////////---对象 tt");
Tests tt = new Tests();
Tests.getFieldByReflect(tt);
}
}
结果为:
////////////---对象 t
x filed is 2
chage x vlaue by reflect is 500
get x value by normal is 500
get x vlaue by reflect is 500
////////////---对象 tt
get x vlaue by reflect is 2
当final x定义的时候赋值了,则反射方法无法改变其值
public class Tests{
final int x=100;
public Tests(){
}
}
result is:
////////////---对象 t
x filed is 100
chage x vlaue by reflect is 500
get x value by normal is 100
get x vlaue by reflect is 500
////////////---对象 tt
get x vlaue by reflect is 100
比较关键的一个API:
AccessibleObject.setAccessible(boolean flag)
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查.
如果底层字段为 final 字段,则该方法将抛出一
个 IllegalAccessException,除非 setAccessible(true) 已经继承该字段并且该字段是一个非静态字段。在通过
程序的其他部分可以访问类的实例之前,只有使用空白 final 字段反序列化或重构类的实例期间,以这种方式设置 final 字段才有意义。在其他任
何上下文中使用该方法都可能会有不可预知的结果,包括程序的其他部分继续使用该字段的原始值的情况。
设置为true,取消访问检查,提升反射效率。
分享到:
相关推荐
java final关键字 java final关键字
java中的final关键字是用来限制用户的。java final 关键字可以在许多上下文中使用
java final关键字(基础)(csdn)————程序
22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22...
内容概要: 本文介绍了Java中final关键字的概念和用法。读者将学习什么是final关键字,为什么需要使用final,以及在不同场景下如何使用final关键字。此外,还会讨论final关键字的一些注意事项和规则。 能学到什么:...
Java中的final关键字可以被用来修饰变量、方法和类等,意味着终结、不可改变,下面我们就来举例讲解Java中final关键字的用法:
带你深入理解Java中的final关键字_动力节点Java学院整理.
Java中的final关键字
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。 1.修饰类 当用final修饰一个类时,表明这个类不能被继承。也就是说,...
Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...
【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
java程序设计中,final 关键字用法,通过代码演示java程序设计中,final 关键字用法,
在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...
浅析Java中的final关键字Java开发Java经验技巧共6页.pdf.zip
final关键字正如其字面意思一样,意味着最后,比如被final修饰后类不能集成、变量不能被再赋值等,以下我们就来深入解析Java编程中final关键字的作用:
下面小编就为大家带来一篇浅谈Java中的final关键字与C#中的const, readonly关键字。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java 关键字final和static
Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例