本文主要介绍了final关键字的使用方法及原理java
具体代码在个人GitHub中能够找到git
https://github.com/h2pl/MyTech
文章首发于个人我的博客:程序员
https://h2pl.github.io/2018/0...
<!-- more -->github
final关键字能够修饰类、方法和引用。修饰类,该类不能被继承。而且这个类的对象在堆中分配内存后地址不可变。微信
修饰方法,方法不能被子类重写。网络
修饰引用,引用没法改变,对于基本类型,没法修改值,对于引用,虽然不能修改地址值,可是能够对指向对象的内部进行修改。多线程
好比char[0] = 'a'。不改变对象内存地址,只改变了值。分布式
具体看一下下面的栗子:学习
final class Fi {this
int a; final int b = 0; Integer s; } class Si{ //通常状况下final修饰的变量必定要被初始化。 //只有下面这种状况例外,要求该变量必须在构造方法中被初始化。 //而且不能有空参数的构造方法。 //这样就可让每一个实例都有一个不一样的变量,而且这个变量在每一个实例中只会被初始化一次 //因而这个变量在单个实例里就是常量了。 final int s ; Si(int s) { this.s = s; } } class Bi { final int a = 1; final void go() { //final修饰方法没法被继承 } } class Ci extends Bi { final int a = 1; // void go() { // //final修饰方法没法被继承 // } } final char[]a = {'a'}; final int[]b = {1};
@Test public void final修饰类() { //引用没有被final修饰,因此是可变的。 //final只修饰了Fi类型,即Fi实例化的对象在堆中内存地址是不可变的。 //虽然内存地址不可变,可是能够对内部的数据作改变。 Fi f = new Fi(); f.a = 1; System.out.println(f); f.a = 2; System.out.println(f); //改变实例中的值并不改变内存地址。 Fi ff = f; //让引用指向新的Fi对象,原来的f对象由新的引用ff持有。 //引用的指向改变也不会改变原来对象的地址 f = new Fi(); System.out.println(f); System.out.println(ff); }
@Test public void final修饰方法() { Bi bi = new Bi(); bi.go();//该方法没法被子类Ci重写 }
@Test public void final修饰基本类型变量和引用() { final int a = 1; final int[] b = {1}; final int[] c = {1}; // b = c;报错 b[0] = 1; final String aa = "a"; final Fi f = new Fi(); //aa = "b";报错 // f = null;//报错 f.a = 1; }
关于字符串的内容能够在上一节查看:
https://blog.csdn.net/a724888...
关于抽象类和接口的内容能够在下一节查看:
https://blog.csdn.net/a724888...
更多内容请关注微信公众号【Java技术江湖】
这是一位阿里 Java 工程师的技术小站,做者黄小斜,专一 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”资料“便可领取 3T 免费技术学习资源以及我我原创的程序员校招指南、Java学习指南等资源)
**