我们所知道的Final

在类上:该类不能被继承,其中所有的方法都不能被重写,但可以被重载, 所以不能同时用abstract和final修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,刚好final起冲突)
在方法上: 该方法不能被重写,但是子类可以用父类中final修饰的方法
在成员变量上: 该成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。
  • 通过上面的描述,我们知道如果被final修饰的成员变量是基本数据类型(例如int),那么该成员变量的值是不能被改变的。但是通过反射我们又验证了只被final修饰但没给定初始值的情况下的基本数据类型是可以通过反射来做到将其值改变的。【因为若同时被static和final修饰的话那值就绝对不可能被改变了】
  • final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。
  • 我们知道在java编译期会做一些优化操作,比如替换一些final的不可变更的参数,所以那些引用了该被final修饰的变量就会被替换成具体的值。而我们现在要知道的是被final所修饰的变量到底是在那才赋值的。

那么static final和final 又有何区别呢?

  1. static修饰的属性强调它是只有一个,被所有对象所共享。
  2. final修饰的属性表明是一个常数(创建后不能被修改)。
  3. static final修饰的属性表示一旦给定值(常数),就不可修改,并且可以通过类名访问(因为只有一个)。

那么我们通过反射对static final修饰的属性及fianl修饰的属性进行修改看看会发生什么。

public class FinalTest1 {public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException, InstantiationException {FinalTest finalTest = new FinalTest(1)或者new FinalTest();Field a = FinalTest.class.getDeclaredField("a");a.setAccessible(true);a.setInt(finalTest,3);System.out.println(a.get(finalTest));System.out.println(finalTest.getA());}
}

①当static final修饰的变量没有给定初始值的时候,结果是报错的。
②当static final有赋予初始值的时候

public class FinalTest {static private final int a=1 ; public int getA(){return a;}
}
结果是报错,解释原因:
Exception in thread "main" java.lang.IllegalAccessException: Can not set static final int field com.gwok.test.FinalTest.a to (int)3at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:76)at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:100)at sun.reflect.UnsafeQualifiedStaticIntegerFieldAccessorImpl.setInt(UnsafeQualifiedStaticIntegerFieldAccessorImpl.java:129)at java.lang.reflect.Field.setInt(Field.java:949)at com.gwok.test.FinalTest1.main(FinalTest1.java:10)

③当final没给定初始值的时候

public class FinalTest {private final int a ;public FinalTest(int a) {this.a = a;}public int getA(){return a;}
}
结果如下33

④当final给定初始值的时候

public class FinalTest {   private final int a =1;public int getA(){return a;    }
}
结果如下31

总结:通过上面的试验,我们发现当变量被static final所修饰时,该变量的值是不能够被改变的,而且该变量必须给予初始值;对于只被final所修饰的变量在定义的时候没有给定初始值的情况下是能够通过反射来改变其代码运行期间所赋予的值,而对于在定义的时候已经给定初始值的情况下即使通过反射也无法改变其值。

Final关键字修饰的变量是否真的不能改变吗相关推荐

  1. 【Java面试题】3 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析...

    /*  * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变  * 答:  * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以 ...

  2. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.

  3. 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

    使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 答: 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. 代码 public ...

  4. Java final关键字修饰变量Test

    使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. package com.test; /*** final修饰一个变量练习* @author M ...

  5. final修饰的变量是引用不能改变还是引用的对象不能改变

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: [java] view plain copy /* ...

  6. final关键字修饰类,方法以及变量的特点 学习

    A:final概述 B:final修饰特点 修饰类,类不能被继承 修饰变量,变量就变成了常量,只能被赋值一次 修饰方法,方法不能被重写 C:案例演示 final修饰特点 class Demo1_Fin ...

  7. 静态static关键字修饰成员变量

    package cn.learn.day08.demo03;public class Student {private int id; // 学号private String name; // 姓名p ...

  8. java final类 能被继承吗_Java中的类被final关键字修饰后,该类将不可以被继承()...

    办公某企业拥有一楼,类被办了续土地月补年1权手出让使用,物折则在计算建筑旧时,为(应取)年经济寿命,补办为5年限0年(自之日出让算起. 的腹痛空腔引起脏器痉挛,关该类质为其性. 病应考种疾虑哪,键字蔓 ...

  9. final 关键字:用来修饰类,方法,成员变量,局部变量

    final 关键字:用来修饰类,方法,成员变量,局部变量 表示最终的不可变的 修饰对象 解释说明 类 无子类,不可以被继承,更不可能被重写. 方法 方法不能在子类中被覆盖 变量 称为常量,初始化以后不 ...

  10. 我对static/final关键字的理解(一个类不同的对象,static修饰的变量,在一个对象中被改变了,对其他对象有无影响?)

    我对static/final关键字的理解 一.static关键字 1.1 static关键字可以修饰的 static关键字可以修饰成员变量.成员方法.初始化块.内部类,被static修饰的成员是类的成 ...

最新文章

  1. 把Redis当作队列来用,真的合适吗?
  2. node.js中对 mysql 进行增删改查等操作和async,await处理
  3. 利用相机SDK采相转换至HImage
  4. Python从键盘输入多行文本数据的方法
  5. vb 通过php连接mysql数据库连接_PHP连接MySQL数据库的几种方法
  6. Failed to read artifact ......明明之前可以的
  7. Fedora 31 及以后版本将不再支持 32 位内核已实锤
  8. 写给那些远程办公程序员的建议!
  9. Python: PyCharm中导入matplotlib时报错:“Backend Qt5Agg is interactive backend”的解决方案
  10. 设置代理_PC客户端爬虫,这样设置代理就对了
  11. python实现一个简单的tftp客户端
  12. Filter实现敏感词汇过滤
  13. em算法python包_关于EM算法原理的分析与理解(Python实现)
  14. 微信怎么和计算机发送文件格式,微信电脑版文档怎么弄 文档发送教程
  15. python神器_牛逼啊!一个可以随时随地写Python代码的神器
  16. html5图标用什么格式转换,ico转png 怎么把ico格式转换成png格式
  17. 模拟退火算法的原理+应用
  18. sqlserver with 语法
  19. 在linux下成功写Bingo游戏
  20. MODULE_AUTHOR 功能

热门文章

  1. 我的世界php motd,我的世界motd标语编辑器
  2. ccd视觉定位教程_CCD视觉定位激光打标机的工作原理
  3. Redhat 更换阿里yum源
  4. 用计算机弹清明上河图谱,[TIF超清] 《清明上河图》北宋 张择端 单幅画1.85GB全卷扫描...
  5. 基于STM32f103的TM1640驱动程序(地址自动加1 和 固定地址)
  6. 健身管理系统一站式智能化健身管理体验
  7. IDEA 使用Tomcat热部署
  8. STM8L中断线和中断端口使用方法
  9. 格雷码和二进制之间的转换
  10. 拉格朗日插值的优缺点_拉格朗日插值法与牛顿插值法比较