`

Java final关键字

    博客分类:
  • Java
 
阅读更多

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`关键字具有重要的地位。它能够用于限定类、方法以及变量的行为,并赋予它们特定的属性。本文将深入探讨`final`关键字在不同场景下的具体用法及...

    【Java编程教程】详解Java final 关键字.pdf

    Java中的`final`关键字是一个非常重要的概念,它用于在编程中实现不可变性。下面是对`final`关键字的详细解释: ## Java最终变量 当一个变量被声明为`final`时,这意味着它的值一旦被赋值后就无法再改变。这在Java...

    java final关键字(基础)(csdn)————程序.pdf

    Java中的`final`关键字是一个非常重要的概念,它用于标记不可改变的元素,包括类、变量和方法。在Java编程中,使用`final`关键字能够帮助我们确保某些代码的行为是不可变的,从而增加代码的稳定性和安全性。 1. **...

    22.final关键字.zip

    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关键字_动力节点Java学院整理

    Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...

    举例讲解Java中final关键字的用法

    Java中的`final`关键字是一个非常重要的概念,它用于表示不可变性或终结状态。下面我们将详细探讨`final`关键字在修饰变量、方法和类时的不同用法。 1. **final变量** - 常量定义:`final`变量一旦被初始化后,其...

    Java零基础-final关键字.md

    ### Java零基础-final关键字 #### 内容概要 本文主要介绍了Java中final关键字的概念及其在实际编程中的应用。读者将能够理解final关键字的基本定义、用途及作用范围,并且掌握如何在不同的编程场景中合理使用它。...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    1. **final关键字** - `final`关键字用于确保变量的值一旦被赋值后就不能改变,或者类和方法不能被进一步扩展。 - 当`final`修饰类时,该类不能被继承,如`final class MyClass {}`,这意味着MyClass不能作为其他...

    Java中final关键字详解

     在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。  1.修饰类  当用final修饰一个类时,表明这个类不能被继承。也就是说,...

    Java编程中static和final关键字的陷阱.pdf

    Java编程中static和final关键字的陷阱.pdf Java编程中static和final关键字的陷阱是Java开发中两个重要的关键字,但是它们的使用也存在一些陷阱,需要开发者注意掌握。 static关键字可以用于修饰属性、方法和类。...

    final关键字详细解读

    final关键字是Java语言中的一个基本概念,它用于限制类、变量、方法以及引用的修改和扩展。final关键字的主要作用是告诉编译器该元素是最终的,不可变的。对于初学者来说,掌握final关键字的使用可以帮助编写出更加...

    java中final关键字和static关键字详细用法

    Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...

    Java中的final关键字详解及实例

    Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。   上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...

    【Java语言基础】final关键字

    【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...

    Java中final关键字的使用与注意总结

    Java中final关键字的使用与注意总结 Java中final关键字的使用与注意总结主要给大家介绍了关于Java中final关键字的相关资料,对大家的学习或者使用Java具有一定的参考学习价值。下面我们将详细介绍final关键字的...

    final 关键字用法

    java程序设计中,final 关键字用法,通过代码演示java程序设计中,final 关键字用法,

    Java中的final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来定义不可变性和唯一性。这个关键字可以应用于变量、方法和类,分别赋予它们不同的特性。以下是对`final`关键字在不同场景下使用的详细介绍: 1....

    深入解析Java编程中final关键字的作用

    在Java编程中,final关键字扮演着至关重要的角色,它用于声明不可变的变量、方法以及类,以确保代码的稳定性和安全性。以下是关于final关键字的深入解析: 1. **final类**: 当一个类被声明为final时,这意味着这...

Global site tag (gtag.js) - Google Analytics