final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。 通常final定义的变量为常量。如:
final double PI = 3.14;
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修饰,这样的常量只能在定义时被赋值。
我正在尝试用Groovy编写一些Spock测试,以测试一些Java代码(特别是一个servlet过滤器)。我有一些和变量想要模拟,但我无法确定是否有方法可以这样做。我知道可用于方法,对于变量有类似的东西吗? 感谢十五世。我现在可以用以下内容来设置:
lambda表达式中使用的变量应为final或有效final 当我尝试使用时,它显示了这个错误。
我正在Android上进行继承领域的培训,我想知道为什么name和color变量的定义来自最终的关键字--当我移除这个关键字时,没有任何用处。而且当我得到这个关键字时,没有错误或意外--请告诉我使用final的原因是什么 mainactivity.java animal.java cat.java
因为这很管用。看起来只有变量名finalResponse在工作。怎么做,为什么?这样做有效吗?
问题内容: lambda表达式中使用的变量应该是final或有效的final 当我尝试使用它时会显示此错误。 问题答案: 可变装置,它可以被实例化一次。在Java中,你不能在lambda以及匿名内部类中使用非最终变量。 你可以使用旧的for-each循环来重构代码: 即使我对这段代码有些不了解: 你调用;而不使用其返回值 使用分配,;你不会修改原始传递的内容,并且你不会在此方法中使用它 你总是返回
我有一个这样的程序: 如果我尝试执行它,我会得到如下编译器错误:< code >变量x可能没有初始化基于java默认值,我应该得到下面的输出对吗?? 最终变量会有默认值吗? 如果我这样更改代码, 我得到的输出是: 有人能解释一下这种行为吗。。