java中被fianl修饰的对象类型的成员变量与基本类型的成员变量

被fianl修饰的对象类型的成员变量

final修饰的成员变量,其值是不能改变的(这里的值指的是对象的引用)。必须进行初始化。另外,在一般情况下创建对象的时候,系统都是对其成员变量进行默认初始化的,一旦被fianl修饰的成员变量是不会被初始化的

public class FinalDemo {
    //声明对象类型的变量
    final String str;//在编译时会提示The blank final field str may not have been initialized
    //意思是:fianl修饰的字段str未被初始化
    public static void main(String[] args) {
    }
}

初始化的方法有三种
1.直接在变量后直接赋值

final String str = "hello"

2.在构造方法中进行赋值

final String str;
public FinalDemo (){
     str = "hello";
}

3.在代码块中进行赋值

final String str;
{
     str = "hello";
}

PS:如果是在静态代码块中进行初始化赋值,那么该成员变必须要被static修饰

验证被fianl修饰对象类型的成员变量是引用不可变,值可变

public class FinalDemo {
    final StringBuilder str = new StringBuilder("Hello");

    public static void main(String[] args) {
        //创建FinalDemo对象
        FinalDemo demo = new FinalDemo();
        System.out.println("str内容是"+demo.str);
        System.out.println("str的hashCode值是"+demo.str.hashCode());

        //对成员变量str进行追加
        demo.str.append(" China");
        System.out.println("sb的值是"+demo.str);
        System.out.println(demo.str+"的hashCode值是"+demo.str.hashCode());
//      输出结果如下所示

//      str内容是Hello
//      str的hashCode值是1690552137
//      sb的值是Hello China
//      Hello China的hashCode值是1690552137
    }
}

如上所诉:
可以看出StringBuilder中的内容变了 而所指向的哈希编码却没发生变化,在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码可以独一无二地确定这个对象。
因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容是可以改变的。

被fianl修饰的基本类型的成员变量

final修饰基本类型的成员变量时,其值是不能被改变的,也是必须进行初始化。

public class FinalDemo {
     final int a = 5;
    public static void main(String[] args) {
        FinalDemo demo = new FinalDemo();
        demo.a = 6;//The final field FinalDemo.a cannot be assigned
        //意思是:无法赋值被fianl修饰的字段
    }
}

基本数据类型的变量,则其数值一旦在初始化之后便不能改变

猜你喜欢

转载自blog.csdn.net/weixin_40471291/article/details/80188886