文档章节

java基础——2final不简单

朱柳瑞
 朱柳瑞
发布于 2014/02/03 08:59
字数 886
阅读 184
收藏 8
        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修饰的方法。


© 著作权归作者所有

共有 人打赏支持
朱柳瑞

朱柳瑞

粉丝 7
博文 6
码字总数 4127
作品 0
东城
程序员
JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0
java核心技术-多线程之线程基础

说起线程,无法免俗首先要弄清楚的三个概念就是:进程、线程、协程。OK,那什么是进程,什么是线程,哪协程又是啥东西。进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,...

xgoing
08/19
0
0
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 JVM参数及调优 JVM实用参数系列 成为Java GC专家(5)...

05/05
0
0
如果你想学习Java,那么就来看这篇文章

一、前言 我是从大二开始学习的Java,当时的目标是Java Web开发,当时并不想考研,所以当时的学习是以就业为主,现在我大三了,学习Java Web开发已经一年了,因为种种原因,决定要考研,所以...

Jivanmoon
08/27
0
0
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

github精选:微信小程序开发技巧(12月31日更新)2016

框架部分 所有页面都需要在 app.json 文件中注册在 pages 数组中,注册格式为:"路径/文件名" 注:文件名无需添加扩展名 app.josn 中的 pages 数组中的第一个页面为小程序的启动页 每个页面的...

阿K1225
10分钟前
0
0
OSChina 周日乱弹 —— 小心着凉 @红薯

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:5.33起,其声呜呜然,如怨如慕,如泣如诉。余音袅袅,不绝如缕。分享Arch Enemy的单曲《Bridge Of Destiny (2009)》 《Bridge Of...

小小编辑
今天
309
4
what f,,

anlve
今天
10
0
初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
15
0
现场看路演了!

HiBlock
昨天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部