Java中final变量使用总结
作者:junjie 时间:2022-09-29 08:32:00
final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。 通常final定义的变量为常量。如:
final double PI = 3.14;
当在程序中使用PI这个常量时,它的值就是3.14,如在程序中再次对定义为final的常量赋值,编译器将不能接受;
final关键字定义的变量必须在声明时对其进行赋值操作。final除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组也可以被用作一个对象引用,所以final可以修饰数组。一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,无法将其改变为另一个对象。一个既是static又是final的字段只占据一段不能改变的存储空间。如下例:
import static java.lang.System.out;
import java.util.Random;
class Test{
int i = 0;
}
public class FinalData {
static Random rand = new Random();
private final int VALUE_1 = 9;//final定义的变量必须使用大写字母命名
private static final int VALUE_2 = 10;//并且使用下划线进行连接;
private final Test test = new Test();
private Test test2 = new Test();
private final int[] a = {1,2,3,4,5,6};
private final int i4 = rand.nextInt(20);
private static final int i5 = rand.nextInt(20);
public String toString()
{
return i4 + "" + i5 + "";
}
public static void main(String[] args) {
FinalData data = new FinalData();
//data.test = new Test();
//data.VALUE_2++;
data.test2 = new Test();
for(int i=0; i<data.a.length; i++)
{
//a[i] = 9;
}
out.println(data);
out.println("data2");
out.println(new FinalData());
out.println(data);
}
}
一个被定义为final的对象只能指向唯一一个对象,不可以将它指向其他对象,但是一个对象本身的值确实可以改变的,那么为了使一个常量真正做到不可更改,可以将常量说明为static final. 如下例:
import static java.lang.System.out;
import java.util.Random;
public class FinalStaticData {
private static Random rand = new Random();
private final int a1 = rand.nextInt(10);
private static final int a2 = rand.nextInt(10);
public static void main(String[] args) {
FinalStaticData fdata = new FinalStaticData();//实例化一个对象
out.println("重新实例化对象调用a1的值:" + fdata.a1);
out.println("重新实例化对象调用a2的值:" + fdata.a2);
FinalStaticData fdata2 = new FinalStaticData();// 实例化新对象
out.println("重新实例化对象调用a1的值:" + fdata2.a1);
out.println("重新实例化对象调用a2的值:" + fdata2.a2);
}
}
重新实例化对象调用a1的值:9
重新实例化对象调用a2的值:2
重新实例化对象调用a1的值:1
重新实例化对象调用a2的值:2
总结:
定义为final常量不是恒定不变的,将随机数赋予final的变量,可以做到每次运行程序时改变a1的值,但是a2被定义为static final形式,所以内存中为a2开辟了一个恒定的区域,当再次实例化一个FianlStaticData对象时,仍然指向a2这块内存区域,所以a2的值保持不变。
技巧:
在JAVA中定义全局常量,通常使用public static final修饰,这样的常量只能在定义时被赋值。
标签:Java,final,变量
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
WinForm实现读取Resource中文件的方法
2021-05-25 18:29:45
![](https://img.aspxhome.com/file/2023/9/108709_0s.png)
Unity调用打印机打印图片
2023-10-18 03:49:48
java结合keytool如何实现非对称签名和验证详解
2021-12-21 21:49:35
macOS上使用gperftools定位Java内存泄漏问题及解决方案
2023-03-02 11:42:38
![](https://img.aspxhome.com/file/2023/2/122042_0s.png)
详解Spring Boot集成MyBatis(注解方式)
2023-10-03 17:45:47
![](https://img.aspxhome.com/file/2023/1/64481_0s.jpg)
Android实现简易计步器功能隔天步数清零查看历史运动纪录
2021-07-24 00:37:02
![](https://img.aspxhome.com/file/2023/1/122241_0s.jpg)
Struts2学习笔记(8)-Result常用类型
2023-06-05 11:10:19
Android 自定义弹性ListView控件实例代码(三种方法)
2022-04-14 15:00:33
Android通过应用程序创建快捷方式的方法
2021-07-08 00:41:09
![](https://img.aspxhome.com/file/2023/0/98630_0s.png)
java同步之如何写一个锁Lock
2023-04-23 08:10:54
![](https://img.aspxhome.com/file/2023/3/63843_0s.png)
SSH框架网上商城项目第8战之查询和删除商品类别功能实现
2023-02-12 05:54:39
![](https://img.aspxhome.com/file/2023/8/81188_0s.jpg)
Android 网络请求框架Volley实例详解
2023-08-11 07:00:18
![](https://img.aspxhome.com/file/2023/7/139487_0s.gif)
详解java调用python的几种用法(看这篇就够了)
2023-04-10 22:15:57
![](https://img.aspxhome.com/file/2023/2/104972_0s.png)
C#实现根据指定容器和控件名字获得控件的方法
2023-09-26 12:23:03
java8新特性-lambda表达式入门学习心得
2021-09-26 17:14:33
![](https://img.aspxhome.com/file/2023/9/76489_0s.jpg)
详解用Spring Boot Admin来监控我们的微服务
2022-02-12 15:18:03
Android保持屏幕常亮2种实现方法
2022-09-08 11:22:43
hibernate 命名查询如何实现
2023-11-04 02:35:41
分析Android Choreographer源码
2022-09-04 07:25:12
![](https://img.aspxhome.com/file/2023/4/105984_0s.jpg)
利用Java自写一个生成ID的工具类
2023-04-24 04:10:08