think in java 笔记(一) final关键字
来源:互联网 发布:java 自行车 编辑:程序博客网 时间:2024/05/24 02:40
说明: 该系列笔记不包括语法层面的基础,比如if,for语句的语法等等,仅记录在阅读过程中觉得比较值得记录的东西。
概念
final关键字表示“不可变”,需要在编译时初始化。(初始化代码块,构造器中,静态初始化代码块不能初始化非静态字段)类似C++ 里的const,相较于C++,没有什么顶层const和底层const的区别。final可以作用于字段,方法,类上,具有不同的效果。
作用在字段上
public Car { public Car(double speed) { this.speed = speed; } private double speed; public void setSpeed(double speed) { this.speed = speed; }}
public Test{ private final int finalInt = 5; private final double finalDouble = Math.random() * 100; public final Car car = new Car(150); //方便起见,这里就直接设置成public}
以上是连个简单例子,finlaInt 是int类型(基本类型),这里直接进行初始化了,实在编译期就能确定值的,首次初始化完毕后将不能被改变。例如,不能这样做:
finalInt = 6; //编译器报错
finalDouble 和 finalDouble差不多,不同的是,他并不能在编译期就确定值,要等到运行时才能确定值。
最后看一下car,car本质上是一个Car的引用,这时候final的效果仅仅是使得Car类型的引用不能被改变,即不能指向其他,但是其内部值(比如这里的speed)是可以被改变的。看下面的例子:
Test test = new Test();Car newCar = new Car(100);test.car = newCar; //编译器会报错,不能对final变量car赋值test.car.setSpeed(200); //没有问题,并且如果输出的话,speed已经变成200.0
作用在方法上
作用在方法上就没有那么多“规矩了”,主要作用是使子类不能重写该方法了。带来的好处是静态编译期就绑定了,不需要动态绑定,这样效率就高了(可以“插入”代码执行,就不存在调用栈的消耗,类似于C++的内联函数,不过和C++一样,这是有编译器决定的,并不总是能“插入”代码块中)
作用在类上
作用在类上仅仅有一个作用,那就是禁止继承。可以看看java.lang.String,这个String就是final类,final类里的方法都默认是final,即使显式的指定final也毫无意义。
总结
final在业务逻辑中虽然用的不多,即使用了大多数时候也仅仅是作为常量来使用,但是理解他还是很有意义的,比如当需要写一些工具类的时候,可以优化效率。
- think in java 笔记(一) final关键字
- [Think in Java 笔记] Final关键字
- Think in java笔记 final
- Think in JAVA 笔记(一)
- Think in Java笔记(一)
- Think In java 笔记一
- think in java笔记:this关键字
- Think in java中的final
- Java语法(一)基本语法(think in java 笔记)
- Think in java 笔记一(第1~2章)
- think in java 学习笔记(一)方法重载
- Think in java 笔记
- think in java 笔记
- Think in java笔记
- think in java 笔记
- Think in java 笔记
- Think In Java 笔记
- Think in Java 笔记
- java中的Object与异常
- NIO
- Go语言打印调用堆栈
- 大米互助
- OpenGl的glMatrixMode()函数理解
- think in java 笔记(一) final关键字
- hql如何使用count
- 关于java项目与web项目中lib包的那点事
- 正则表达式
- Windows下python3 连接SQL Server
- JavaWeb 3年工作经验(几个点)
- Spring Cloud vs k8s
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 1039. 到底买不买(20)