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`关键字具有重要的地位。它能够用于限定类、方法以及变量的行为,并赋予它们特定的属性。本文将深入探讨`final`关键字在不同场景下的具体用法及...
Java中的`final`关键字是一个非常重要的概念,它用于在编程中实现不可变性。下面是对`final`关键字的详细解释: ## Java最终变量 当一个变量被声明为`final`时,这意味着它的值一旦被赋值后就无法再改变。这在Java...
Java中的`final`关键字是一个非常重要的概念,它用于标记不可改变的元素,包括类、变量和方法。在Java编程中,使用`final`关键字能够帮助我们确保某些代码的行为是不可变的,从而增加代码的稳定性和安全性。 1. **...
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` 关键字可以...
Java中的`final`关键字是一个非常重要的概念,它用于表示不可变性或终结状态。下面我们将详细探讨`final`关键字在修饰变量、方法和类时的不同用法。 1. **final变量** - 常量定义:`final`变量一旦被初始化后,其...
### Java零基础-final关键字 #### 内容概要 本文主要介绍了Java中final关键字的概念及其在实际编程中的应用。读者将能够理解final关键字的基本定义、用途及作用范围,并且掌握如何在不同的编程场景中合理使用它。...
1. **final关键字** - `final`关键字用于确保变量的值一旦被赋值后就不能改变,或者类和方法不能被进一步扩展。 - 当`final`修饰类时,该类不能被继承,如`final class MyClass {}`,这意味着MyClass不能作为其他...
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。 1.修饰类 当用final修饰一个类时,表明这个类不能被继承。也就是说,...
Java编程中static和final关键字的陷阱.pdf Java编程中static和final关键字的陷阱是Java开发中两个重要的关键字,但是它们的使用也存在一些陷阱,需要开发者注意掌握。 static关键字可以用于修饰属性、方法和类。...
final关键字是Java语言中的一个基本概念,它用于限制类、变量、方法以及引用的修改和扩展。final关键字的主要作用是告诉编译器该元素是最终的,不可变的。对于初学者来说,掌握final关键字的使用可以帮助编写出更加...
Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...
Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...
【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...
Java中final关键字的使用与注意总结 Java中final关键字的使用与注意总结主要给大家介绍了关于Java中final关键字的相关资料,对大家的学习或者使用Java具有一定的参考学习价值。下面我们将详细介绍final关键字的...
java程序设计中,final 关键字用法,通过代码演示java程序设计中,final 关键字用法,
在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来定义不可变性和唯一性。这个关键字可以应用于变量、方法和类,分别赋予它们不同的特性。以下是对`final`关键字在不同场景下使用的详细介绍: 1....
在Java编程中,final关键字扮演着至关重要的角色,它用于声明不可变的变量、方法以及类,以确保代码的稳定性和安全性。以下是关于final关键字的深入解析: 1. **final类**: 当一个类被声明为final时,这意味着这...