博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础——2final不简单
阅读量:6241 次
发布时间:2019-06-22

本文共 1956 字,大约阅读时间需要 6 分钟。

hot3.png

        final——一个并不陌生的java关键字,修饰变变量(包括实例变量,类变量)、方法、类。下面一行很常用到的code:
public static final String BACE_INFO = "baseinfo";
        首先,先明确一下,
  1. final修饰的变量不可以重新赋值。
  2. final修饰的方法不可以被重写。
  3. final修饰的类不可以派生子类。
  4. final修饰的实例变量必须显式的指定初始值,并且只能在以下三个位置初始化。
public class FinalInstanceTest{    //定义变量时初始化    final int var1 = 2;    final String var2;    final double var3;    //非静态初始化代码块    {        var2 = "吃饭睡觉打豆豆";    }    //构造器中初始化    public FinalInstanceTest(){        this.var3 = 3.14;    }}

但是本质上final实例变量的初始化都是在构造器中进行的。

    5. final修饰的类变量也必须在定义时或静态初始化块中显式初始化,而本质上都是在静态初始化块中进行的。
       我们着重看以下final修饰的字符串,小伙伴们判断一下下面程序的输出结果

public static void main(String[] args) {	String str1 = "javacode";	String str2 = "java" + "code";	System.out.println(str1 == str2);  ------------------A	String str3 = "java";	String str4 = "code";	String str5 = str3 + str4;	System.out.println(str1 == str5);  ------------------B}

        先公布结果:A 处代码会输出true 而B处代码会输出false。
        先来研究下A处代码。有人会说明明是两个String对象怎么会输出true呢?java存在一个java字符串缓冲池,他会缓存所有使用过的字符串直接量。str1 = "javacode" 这里便会缓存javacode这个字符串对象,而str2 = "java" + "code";可以在编译时确定str2为"javacode"所以系统自动将str2指向字符串缓存的"javacode"。所以str1和 str2指向同一个字符串对象。而B处的代码,str5不能再编译时确定,系统就不会将str5指向缓存池中的"javacode",结果也就会输出false。
        那么什么是编译时确定呢?我理解为变量的赋值中不访问普通变量,不调用方法,只是基本的算术运算表达式或字符串连接运算,这样的变量能够被系统编译时确定。显然上述代码中str1、str2符合,而str5不符合。
如何将B处也输出true 呢?我们用到了final关键字。
        修改代码如下
public static void main(String[] args) {	String str1 = "javacode";	String str2 = "java" + "code";	System.out.println(str1 == str2);  ------------------A	final String str3 = "java";	final String str4 = "code";	String str5 = str3 + str4;	System.out.println(str1 == str5);  ------------------B}

        这时B处将输出true。
        事实上final修饰的变量已经成为一个直接替换量(这是我自己起的名字),当后续代码再次用到这个变量时,系统会自动将其替换成相应的值,因此 String str5 = str3 + str4;相当于 String str5 = "java"+"code";str5也就可以编译时确定了。此外相对于实例变量而言,在定义时赋初始值,非静态初始化块中,构造器中赋初始值都是一样的,都将在构造器中执行,但是对于final变量只有在定义时赋初始值才会被直接替换。
        另外关于final修饰的方法,主要强调在继承中存在的问题。被final修饰的方法子类不能重写,而且实际上子类也无法访问到父类中final修饰的方法。

转载于:https://my.oschina.net/u/854416/blog/197109

你可能感兴趣的文章
Linux文件权限与属性详解 之 chattr & lsattr
查看>>
负载均衡集群之LVS配置命令
查看>>
PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
查看>>
多线程编程
查看>>
再谈谈数学
查看>>
Scheme来实现八皇后问题(1)
查看>>
pip或者anacnda安装opencv以及opencv-contrib
查看>>
Unity 5 中的全局光照技术详解(建议收藏)
查看>>
python 的矩阵运算——numpy
查看>>
处理handler中的内存泄漏
查看>>
P8 Visible Lattice Points
查看>>
小小不爽一下
查看>>
【转】NuGet学习笔记(1)——初识NuGet及快速安装使用
查看>>
Python学习笔记 - MySql的使用
查看>>
WebApi FormData+文件长传 异步+同步实现
查看>>
Linux文件与目录管理
查看>>
多态的弊端
查看>>
Spring @Import 注解
查看>>
PBOC APDU命令解析【转】
查看>>
封装HttpUrlConnection开箱即用
查看>>