7.final关键字.md

1.final类型变量

定义:被final修饰的变量,一旦被赋初值后,则final类型变量的值就不能再改变。

1.1成员变量
final修饰的成员变量必须显式的赋初值。
赋值的位置:
•类变量:静态初始化块中或者声明改类变量时候
•实例变量:非静态初始化块中,声明实例变量时候,构造器中
•未初始化之前不能调用final修饰的变量

public class VariableAssignment {
    //声明时候赋值
    final float num = 2f;
     
    //定义后在初始化块中
    final String name;
    {
        this.name = "haha";
    }
     
    //类变量在静态语句块中赋值
    final static double d;
    static{
        d = 2.0;
    }
     
    //构造中赋值
    final int n;
    public VariableAssignment(){
        n = 6;
    }
} 

1.2局部变量
final修饰的局部变量可以赋值也可以不赋值,但是赋值只能一次。

1.3final修饰基本类型变量和引用类型变量的区别
final修饰基本类型变量,不能对已经赋值的变量再次修改值。但是对于引用类型变量而言,final保证的只是地址不变,但是对象本身是可能改变的

    public class Person {
    private int age;
     
    public Person(int age){
        this.age = age;
    }
     
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
     
} 

123456789 public class Study {
    public static void main(String[] args) {
        final Person p = new Person(2);
        //通过set方法改变了值

        p.setAge(6);
        int num = p.getAge();
        System.out.println(num);
         
    }//main
} 

1.4 final的宏替换作用

public class Study {
    public static void main(String[] args) {
        final String s1 = "Hello World";
        final String s2 = "Hello" + " World";
        final String s3 = s1 + s2;
        System.out.println(s1 == s2); //输出true,s1在编译阶段已经被放到常量池中,s2和s1一样,所以直接引用常量池中的内容        System.out.println(s1 == s3); //输出false,因为s3在编译阶段无法确定内容,所以不能用宏替换
         
    }//main
} 

2.final方法

3.final类

4.不可变类

原文地址:https://www.cnblogs.com/bugstar/p/8492457.html