一、概述
final 最终的 不能改变的。
final 修饰一个变量,有很多种说法,比如不能改变等等
准确的描述是 当一个变量被final修饰的时候,该变量只有一次赋值的机会不能改变的是变量空间里面存的值或者引用地址。
在栈内存中 final int a = 1;这种赋值后是不能再改的。
final int[] a = {1,2,3} 这种栈里a变量空间存放的是堆内存的地址。地址是不可变的,但是数组里的值是可以变
二、代码示例
情况一:申明时已赋值
public class HelloWorld {
public void method1() {
final int i = 5;
i = 10; //i在第4行已经被赋值过了,所以这里会出现编译错误
}
}
情况二:申明时未赋值
public class HelloWorld {
public void method1() {
final int i;
i = 10; //i在第4行,只是被声明,但是没有被赋值,所以在这里可以进行第一次赋值
i = 11; //i在第6行已经被赋值过了,所以这里会出现编译错误
}
}
特别情况:
final 修饰的变量在方法中,可以先初始化再赋值。
但是如果是全局变量(即修饰类的属性),必须在初始化的时赋值,不然会报错。
package Test;
public class FinalLearning {
// final 修饰的变量在方法中,可以先初始化再赋值。
// 但是如果是全局变量(即修饰类的属性),必须在初始化的时赋值,不然会报错。
final int b = 0;
public static void main(String[] args) {
final int a;
a = 3;
System.out.println(a);
}
}
三、如果final修饰的是参数,能否在方法里给这个参数赋值?
代码如下:
public class HelloWorld {
public void method1(final int j) {
j = 5; //这个能否执行?
}
}
结果:不能
原因:因为在方法被调用时,实参传到形参,就已经对final变量初始化了。所以不能在方法里赋值。
四、关于final修饰变量时候进行运算的问题
1、问题描述
贴了两段代码,变量ab都用final声明,区别是赋值的位置不同,第一段可以运行,第二段会提示cannot convert from int to byte
为什么会不同?机理是什么?
public class test {
public static void main(String[] args) {
final byte a=1;
final byte b=2;
byte c=a+b;
System.out.println(c);
}
}
public class test {
public static void main(String[] args) {
final byte a;
a=1;
final byte b;
b=2;
byte c=a+b;//报错
byte c=(byte)(a+b);//不报错
System.out.println(c);
}
}
原因解释:
和常量池有关。
第二个是先定义后赋值,常量池里就有两个空间,一个放a,一个放1(1是int),然后相加那里加的其实是a里面的值(int的1),所以最后报错int不能转为byte.
被final修饰的变量,在编译阶段就确定了该变量的值,并且不能再改变,所以两个被final修饰的byte值相加应该不能被提升为加为int型,1是放在a那个空间里的,还是byte类型,所以不需要强转。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103265.html