欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

java的final也并不是那么高冷

发布时间:2024/10/14 编程问答 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java的final也并不是那么高冷 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

这天,final走过来和static说:我喜欢你咱来咱俩在一起吧.

一向安静的static一下子懵了,他眼前的final一向很高冷,今天怎么。。。。

于是static说:让我再想想行吗(因为现在的static还不是很了解final)

目录:
1.修饰类

2.修饰方法

3.修饰变量

4.final变量和普通变量的区别

5.关于final static的用法

1.修饰类

当一个类被final修饰的时候就被称为最终类
最终类的特点是不能再被继承

2.修饰方法

final修饰的方法不能被重写
但是能被子类访问(前提是访问修饰符不是private)

3.修饰变量

(1)final修饰变量的特点

不管是修饰基本数据类型的变量还是修饰引用数据类型的变量,则对其初始化后就不能再更改


不过这里有一点要注意虽然指定的对象不可以改变但是对象里边的内容确是可以改变的

如图:
·
运行结果:

(2)final修饰成员变量

如果定义一个带final的成员变量那么必须在定义的时候就初始化或者在构造方法里边初始化(同样的初始化后不能更改

(2)final修饰局部变量

当final修饰局部变量的时候只要使用的时候初始化就行了

4.final变量和普通变量的区别

先来一段代码:

不知道博主在搞什么花里胡哨的,mmp

这时候博主晒出了答案:

这么叼😶博主解释解释

其实博主也不会

垃圾博主走了走了

哎哎!别走啊,开玩笑的

这里就是final修饰的变量和普通变量的区别了,也就是当final修饰的基本数据类型或String类型如果在编译期间就知道他的确切的值那么再用到这个变量的时候系统就会把他当成常量访问(也叫编译器的优化),有点类似C语言的宏替换

什么叫编译期间就知道他的确定的值呢,就是一个由final定义的变量直接被赋值
比如:

final int a=1//直接赋值 final String b="123123";//直接赋值

编译期间就知道确切的值又叫编译的时候初始化

如果间接赋值那么编译期间就不知到它的值也就不会把它当成常量
比如:

int a=1; final int b=a;

又叫运行时初始化、

再看看题
第1,2个false
两个普通的字符串变量相加会建立一个新的对象由于== 比的是地址,所以二者肯定false,第二个其实在运行的时候jvm会把它当
成a+“world”==“helloworld”,由于里边有普通的String变量所以也会创建一个新的对象

第三个true
可以这么理解,编译器运行的时候由于”宏替换“就会把表达式变成c==“hello”+“world”,然后jvm在运行的时候会把两者合起来
检查常量池有没有“helloworld”这个字符串,如果有的话就把这个常量池里边的字符串和c进行比较,巧的是c恰好是这个字符串的引用所以就是true

为了更方便的理解编译初始化和运行初始化我们看这段代码:

package Demo;class FinalDemo {public final double i = Math.random();public static double t = Math.random(); }public class DemoDemo {public static void main(String[] args) {FinalDemo demo1 = new FinalDemo();FinalDemo demo2 = new FinalDemo();System.out.println("final修饰的 i=" + demo1.i);System.out.println("static修饰的 t=" + demo1.t);System.out.println("final修饰的 i=" + demo2.i);System.out.println("static修饰的 t=" + demo2.t);System.out.println("t+1= "+ ++demo2.t ); // System.out.println( ++demo2.i );//编译失败} } 运行结果:final修饰的 i=0.7282093281367935static修饰的 t=0.30720545678577604final修饰的 i=0.8106990945706758static修饰的 t=0.30720545678577604t+1= 1.307205456785776

我已经听到博友们的尖叫声了:

博主来解释解释:
首先final修饰基本数据类型的变量时,则其数值一旦在初始化之后便不能更改。

是的,已经很明显了,上面代码中被final修饰的变量是在运行时才初始化的并没有在编译期就被初始化!由于值为随机数,运行时被初始化是不确定的一个值,也就是个随机数,仅仅当运行之后被初始化之后==他的值才会不变!,所以它再次运行的时候就会又有一个随机数

至于static修饰的变量没有发生变化是因为static作用于成员变量只是用来表示==保存一份副本其不会发生变化。怎么理解这个副本呢?其实static修饰的在类加载的时候就加载完成了(初始化)==,而且只会加载一次也就是说初始化一次,所以不会发生变化!

不懂static这里博主为自己的博客打一个广告
静态类详细讲解

1.关于final static

作用:

1、成员变量:属于类的变量且只能赋值一次。
2、方法:属于类的方法且不可以被重写。
3、内部类:属于外部类,且不能被继承。

static了解到final是一个用情专一的男孩子,而且也很单纯,于是static果断把final约了出来对他说…

”我是伪娘“

博主:没想到吧

“欸欸欸,博友们别拿鸡蛋砸我,哎哎哎,别打我脸,我错…”

博友:”兄弟们停,让他说完“

博主:

博友:”往死里干”
。。。。。。。。。。

总结

以上是生活随笔为你收集整理的java的final也并不是那么高冷的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。