文档章节

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学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
11/15
131
0
kan-java, 一个能裁剪语法特性的java动态编译工具

'kan-java' 就是 '砍-java', 就是字面意思 这是一个java代码动态编译工具,也就是能够把String形式的java代码实时地编译为字节码的工具; “动态编译”工具,其实自jdk1.6发布以来,应该出现...

pf_miles
2015/03/28
172
0
本地方法怎么映射Java层的数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/79576578 前言 Java 语言上定义了不同的数据类型,比如有基础类型、等等,还...

超人汪小建(seaboat)
03/16
0
0
《成神之路-基础篇》JVM——JVM参数及调优(已完结)

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

05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

stylus

stylus基础教程,stylus实例教程,stylus语法总结

miaojiangmin
9分钟前
0
0
PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
5
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部