java中final double_举例讲解Java中final关键字的用法_阿特拉斯大兄弟的博客-程序员秘密

技术标签: java中final double  

1. final variable

final variable 就是一个常量,一旦被初始化就不可以被改变。

class Test1 {

final double PI = 3.14; //常量的名称最好大写

public Test1(){

PI = 3.14;

}

void test(){

System.out.println("PI is: " + PI);

}

public static void main(String[] args){

Test1 t = new Test1();

t.test();

}

}

输出:

PI is: 3.14

(1)Blank final variable

在声明时未初始化的 final variable 被称作 blank final variable, blank final variable必须在 构造函数中被初始化,否则会抛出编译错误。

class Test1 {

final double PI;

Test1(){

PI = 3.14; //在构造函数中初始化

}

void test(){

System.out.println("PI is: " + PI);

}

public static void main(String[] args){

Test1 t = new Test1();

t.test();

}

}

输出:

PI is: 3.14

(2)Uninitialized static final variable

在声明阶段未初始化的 static final variable 只能在静态代码块中被初始化

class Test1 {

static final double PI;

static {

PI = 3.14;

}

void test(){

System.out.println("PI is: " + PI);

}

public static void main(String[] args){

Test1 t = new Test1();

t.test();

}

}

输出:

PI is: 3.14

2. final method

final method 不能被覆盖。也就是说子类可以调用父类的 fianl method,但是不能覆盖它。

class Test {

static final double PI = 3.14;

final void test(){

System.out.println("PI is: " + PI);

}

}

class Test1 extends Test{

public static void main(String[] args){

Test1 t = new Test1();

t.test();

}

}

输出:

PI is: 3.14

3. final class

final calss 不能被继承

final class Test1 {

static final double PI = 3.14;

final void test(){

System.out.println("PI is: " + PI);

}

public static void main(String[] args){

Test1 t = new Test1();

t.test();

}

}

输出:

PI is: 3.14

PS:java.lang.String类为什么设计成 final 的?首先,先得清楚 final 这个关键字。

final的出现就是为了为了不想改变,而不想改变的理由有两点:设计或者效率。final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。

了解了这一点,我们再看看问题:

(1)从设计上讲,

A、确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。

B、String 一旦被创建是不能被修改的,因为 java 设计者将 String 为可以共享的,下面这段是源码中的注释:

(2)从效率上讲:

A、设计成final,JVM才不用对相关方法在虚函数表中查询,而直接定位到String类的相关方法上,提高了执行效率。

B、Java设计者认为共享带来的效率更高。

总而言之,就是要保证 java.lang.String 引用引用的对象一定是 java.lang.String的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42566121/article/details/114233680

智能推荐

linux操作系统 第一章:Linux的概述简答题_1.(简答题)解释一下linux操作系统的不同变体?_李超_38241415115的博客-程序员秘密

第一题:             Linux采用什么版权方式发行?这种版权与通常的商业软件有何区别?              答:linux采用GPL(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译。它并非由自由软件基金会所发表,亦非使用GNU通用公共授权的软件的法定发布条款一直有GNU通用公共授权英文原文的版本具有此等效力。)版

PAT1006-换个格式输出整数_qq_40806898的博客-程序员秘密

PAT - 10061006 换个格式输出整数 (15 分)让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12…n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。输入格式:每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。输出格式:每个测试用例的输出占一行,用规定的格式输出 n。输入样例 1:234

android图片资源加密解密,Android下资源图片的加密和解密_weixin_39579483的博客-程序员秘密

apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的。这个问题探索了许久……【1】图片资源不放置在drawable文件下,放在assets中(但是解压apk,同样能看到图片资源),以下说说使用方法。分析:Ⅰ)当图片资源放在drawable中的时候,能有相应的Id去解析:BitmapFactory.decodeResource(res, id)如果放置在as...

分布式之数据库和缓存双写一致性方案解析_javaQQ群 866865133的博客-程序员秘密

为什么写这篇文章?首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一篇全面的博客,对这几种方案进行解析。如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Sp...

计算机未来的发展英语作文,关于科技发展英语作文(通用10篇)_Youlink L的博客-程序员秘密

关于科技发展英语作文(通用10篇)在平平淡淡的学习、工作、生活中,大家总免不了要接触或使用作文吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。那么一般作文是怎么写的呢?下面是小编为大家整理的关于科技发展英语作文(通用10篇),欢迎大家借鉴与参考,希望对大家有所帮助。科技发展英语作文121st century is the century of technology.Nowa...

android rsa 加密解密,Android RSA加密解密文件_南茗hy的博客-程序员秘密

【实例简介】Android RSA加密解密文件【实例截图】【核心代码】AndroidRSA加密解密文件└── RSA├── AndroidManifest.xml├── assets│ ├── rsa_private_key.pem│ └── rsa_public_key.pem├── bin│ ├── AndroidManifest.xml│ ├── classes│ │...

随便推点

shell学习18:if判断-e,-f,-f,-L,-r,-w,-x,-s,-nt,-ot的意思_shell if -l_天泉证道的博客-程序员秘密

filename为文件名-e (equal)-e filename, 判断文件是否存在-d (directory)-d filename,判断文件是否为目录-f (file)-f filename,判断文件是否为常规文件-L (link)-L filename,判断文件是否问链接文件-r (read)-r filename,判断文件是否可读-w (write)-...

Swagger-UI 基于REST的API测试/文档类插件_weixin_34406796的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

河北省计算机二级报名时间2016,2016下半年燕山大学计算机二级报名_weixin_39789094的博客-程序员秘密

2016下半年燕山大学计算机二级报名导读:2016下半年燕山大学计算机二级考试报名时间为6月18日开始至7月5日,报名费用为80元,考试时间为9月24日-25日,具体内容请看如下信息。想了解更多相关信息请持续关注我们应届毕业生考试网!各系及相关考生:2016年下半年全国计算机等级考试(以下简称“NCRE”)将于9月24日-25日举行。现就报名工作有关事项通知如下:一、级别及科目2016年下半年NC...

tensorflow 使用flags定义命令行参数,TensorFlow tf.app&tf.app.flags用法介绍_qq_1410888563的博客-程序员秘密

转载:https://blog.csdn.net/leiting_imecas/article/details/72367937tf定义了tf.app.flags,用于支持接受命令行传递参数,相当于接受argv。import tensorflow as tf#第一个是参数名称,第二个参数是默认值,第三个是参数描述tf.app.flags.DEFINE_string('str_name...

把上传的文件的内容存到数据库_天意young的博客-程序员秘密

上传文件大致就是input 中的file添加一个id属性,获取到文件通过ajax传递到后台,后台通过params获取文件,后台接收文件,读取里面的内容,存到数据库当中,此处只把文件内容拼成一个大的字符串存到一个字段当中var upFiles = document.getElementById("fileid").files;var params = new FormData();para...

Redis的服务器安装与可视化工具安装和使用以及应用场景_念旧、sunshine的博客-程序员秘密

在Windows下使用redis1、服务器下载:redis官方下载地址在cmd中执行 通过配置文件启动redis服务器验证2、下载可视化工具:redis-desktop-manager3、如果可视化工具连接不上redis服务端。检查你是否设置了密码4、redis特性:Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了...

推荐文章

热门文章

相关标签