Java | 关于final修饰变量的认识补充

一、概述

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类型,所以不需要强转。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值