首页 / JAVA / Java入门系列之final
Java入门系列之final
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java入门系列之final,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2344字,纯文字阅读大概需要4分钟。
内容图文
前言
在C#经典面试中掺杂过Java的final关键字,主要用于类不能被继承,在C#则是利用关键字seal修饰类为密封类,而在Java中的final关键字的具体用法包含C#中const、readonly、seal三者使用之和,本节我们来聊聊Java的关键字final。
关键字final
通过final关键字修饰意为无法改变,在Java早期版本通过final可以改善性能或者提高效率,但现如今版本final已经无所谓性能,我们只关注于在设计时应用final的具体场景,final关键字包含两层含义:其一,编译时常量不变,其二,运行时初始化值而后不被改变。这两者其实就是C#中的const和readonly关键字的使用。 final主要用于三种情况,修饰数据、方法、类,但本质上都是表示不可变,至于“不可变”的含义就看对应哪种场景。当然加上static修饰符只是表明在内存中只保存一份数据,这里我们就不做过多探讨。
数据
编译时常量和C#中概念一致,只不过C#用const修饰,同时对于变量的命名都是采用大写方式,单词与单词之间用下划线隔开,比如如下编译时常量
public final int VALUE_ONE = 1;
上述已经说过,final不仅仅只是对于编译时必须为常量,还可以用于运行时初始化时的值,比如通过随机函数生成值
public static Random random = new Random(); publicfinalint VALUE_ONE = random.nextInt(20);
这种运行时初始化值方式就是C#中的readonly,如下:
public static Random random = new Random(); publicreadonlyint VALUE_ONE = random.Next(20);
对于C#中的readonly初始值,我们知道除了在定义时赋值,也可以在构造函数中初始化值,若是再加上static,很显然必须在静态构造函数中初始化
class Program { public readonly int VALUE_ONE; public Program() { VALUE_ONE = 1; } }
final关键字同样也能达到上述使用readonly的效果,只不过在Java中称其为“空白final”,所谓空白final是指被声明为final但未给定初始值,但是无论何种情况,编译器必须确保在使用数据之前必须进行初始化
public class Main { public final int VALUE_ONE; public Main() { VALUE_ONE = 1; } }
参数
无论是作为方法参数还是作为初始化变量的修饰,我们可以更改该参数里面的值,但是无法更改参数引用所指向的对象。如下示例为修饰初始化类变量,作为方法参数同理,这里不再阐述。
class Value { int i; public Value(int i) { this.i = i; } } publicclass FinalDemo { publicfinal Value value = new Value(1); }
public class Main { public static void main(String[] args) { FinalDemo finalDemo = new FinalDemo(); //可以更改final参数里的值 finalDemo.value.i = 2; //不能更改参数所指向的对象(编译报错) finalDemo.value = new Value(2); } }
方法
final修饰方法是将方法进行锁定,以防止任何继承类修改它本身的含义,此意为用以标记该方法不能被覆盖(对于对象范围内)或隐藏,这为后续开发人员创建其方法所在类的子类无法覆盖其行为提供有力的保证。比如如下计数器则是一个很好的例子
public class Counter { private int counter = 0; publicfinalint count() { return ++counter; } publicfinalint reset() { return (counter = 0); } }
但是我们去掉上述count方法的修饰符,进行如下操作,很显然将破坏原始方法的行为,打印出结果为2
Counter c = new Counter() { publicint count() { super.count(); returnsuper.count(); } }; System.out.println(c.count());
类
若将整个类定义为final时,这说明此类将不会被继承和C#中seal修饰符如出一辙,或出于安全考虑,或出于设计已确定该类不会再做任何变动,不希望该类有子类
public final class Counter { } // 编译发生错误 class SubCounter extends Counter { }
总结
本节我们详细讲解了final关键字,该关键字是C#中const、readonly、seal三者使用的组合,Java编程思想虽然将其划分为数据、方法、类,这里我认为划分为变量(包含数据和参数)、方法、类更合理。其实语法都大同小异,还是那句话,学习的本质在于归纳总结并举一反三从而内化。
原文:https://www.cnblogs.com/CreateMyself/p/13269362.html
内容总结
以上是互联网集市为您收集整理的Java入门系列之final全部内容,希望文章能够帮你解决Java入门系列之final所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。