Java中final修饰的变量是如何赋值的?

众所周知,在Java中,final关键字可以修饰变量,方法和类。它们表达的意义如下:

1:修饰变量:该变量赋值之后不可再修改或重新赋值,这种变量可以当成常量使用

2:修饰方法:方法不可被重写

3:修饰类:类不可被继承

本篇文章老谭专门探讨一下final修饰变量的情况。

先看下面的代码片段:

public class FinalDemo {
    final int NUM;
    void m1() {
        final int NUM1;
    }
}

该段代码编译不会成功。final修饰的类成员NUM是必须赋值的,最简单的写法就是使用如下语句:

final int NUM=20;

而final修饰方法中的局部变量则无需同时赋初始值,可以在使用之前赋值,但不可多次赋值。

但是可以使用初始化块或构造方法为final修饰的类成员赋值,而且实例初始化块甚至可以出现在类成员声明之前:

public class FinalDemo {
    final int NUM;
    {
        NUM=20;
    }
    void m1() {
        final int NUM1;
    }
}

使用构造方法为final修饰的类成员赋值也是可行的:

public class FinalDemo {
    final int NUM;
    public FinalDemo() {
        NUM = 20;
    }
    void m1() {
        final int NUM1;
    }
}

类似的,如果final与static同时使用的话,则应该使用静态初始化块为该成员赋值。

另外一种情况是final修饰的引用类型。

假设有以下两个类:

public class User{
    int num;
}
public class FinalDemo {
    final User user = new User();

    public static void main(String[] args) {
        FinalDemo demo = new FinalDemo();
        demo.user = new User();
    }
}

编译时demo.user=new User();这句代码会出现编译错误,因为user是final修饰的,不可重新赋值。但是以下代码能够成功编译:

public class FinalDemo {
    final User user = new User();

    public static void main(String[] args) {
        FinalDemo demo = new FinalDemo();
        demo.user.num = 30;
    }
}

因为final变量中的非final属性是可以重新赋值的。

PS:如果遇到有关于百科类创建编辑修改的任何问题,欢迎留言咨询,百科参考网无偿免费回答。请注明出处:https://www.2333.org.cn/2333/12591.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注