首页 > 代码库 > 哎,又是一个final引发的问题

哎,又是一个final引发的问题

啥都不说了,今天我就是和final关键字给杠上了,看题:

public class Test {
    final int age;
    public Test(){
        age=10;
    }
    
    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

执行结果如下所示:

技术分享

 

思路分析:

 

今天忙活了一天有点累了,我也不扯那么多了,直接进入正题。我又做了个图,哈哈,不要打我,图这个东西可以声情并茂的解决问题,哦,不对,比喻错了,但是也可以解决问题!来看看执行顺序吧!这样就明白了。

技术分享

    前面不是说被final修饰过的不能发生改变吗?这句话一点也不错,确实没有发生改变,根据执行顺序我们可以看到,age属性的初始值就是10,因此执行结果是10很正常的。当代码改为如下时就能到达你心目中不能改变的要求啦!

    

public class Test {
    final int age;
    public Test(){
        age=10;
    }
    
    public void say(){
        age = 20; //执行错误,不能再次赋值
    }
    
    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

   当我们添加say()方法为age属性重新赋值时,程序就会出错。因此不能发生改变的情况是发生在初始化之后的。

public class Test {
    final int age = 8;
    public Test(){
        age=10;
    }

    public static void main(String[ ] args) {
        System.out.println(new Test().age);
    }
}

  但是如上述情况中,age是直接就被初始化赋值了,因此在构造器中便不能再次赋值了。

    

哎,又是一个final引发的问题