final修饰符使用中遇到的一些问题

文章目录

  • final修饰符
  • 1. final不能用来修饰构造方法
  • 2. final修饰变量的一些注意问题
    • 2.1 final修饰成员变量
    • 2.2 final修饰引用类型
      • 2.2.1 演示代码中lombok链式编程介绍

final修饰符

final具有“不可改变”的含义,它可以修饰非抽象类、非抽象成员方法和变量。

  • 用final修饰的类不能被继承,没有子类
  • 用final修饰的方法不能被子类的方法覆盖(Override)
  • 用final修饰的变量表示常量,只能被赋值一次

1. final不能用来修饰构造方法

final不能用来修饰构造方法,因为“方法覆盖(Override)”仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖(Override)关系,所以用final修饰构造方法是无意义的。

2. final修饰变量的一些注意问题

2.1 final修饰成员变量

final修饰成员变量,必须显示初始化,否则会产生编译错误

final修饰符使用中遇到的一些问题_第1张图片

  1. final修饰的实例变量,可以在定义变量时候或者在构造方法中进行初始化
public class TestFinal1 {

    final int i=1;

    final int j;

    public TestFinal1(int j) {
        this.j = j;
    }
}
public class TestFinal1 {

    final int i;

    final int j;

    public TestFinal1(int i, int j) {
        this.i = i;
        this.j = j;
    }
}
  1. final修饰的静态变量,可以再变量定义时进行初始化,或者在静态代码块中初始化
public class TestFinal1 {

    static final int i=1;

    static final int j;

    static {
        j=2;
    }
}

2.2 final修饰引用类型

final修饰引用类型变量,那么该变量只能始终引用一个对象,但是对象的内容可以改变

@Data
@Accessors(chain = true)
public class Person {

    private String name;

    private int age;
}
public class TestFinal {

    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>(){{
            add(new Person().setAge(25).setName("张三"));
            add(new Person().setAge(28).setName("李四"));
            add(new Person().setAge(34).setName("王五"));
        }};

        List<Person> newPersonList = new TestFinal().method(personList);
        System.out.println(newPersonList);
    }

    public List<Person> method(final List<Person> personList){
        personList.add(new Person().setAge(29).setName("朱六"));
        return personList;
    }
}

输出结果:

[Person(name=张三, age=25), Person(name=李四, age=28), Person(name=王五, age=34), Person(name=朱六, age=29)]

2.2.1 演示代码中lombok链式编程介绍

在实体上面添加注解@Accessors(chain = true),如:

@Data
@Accessors(chain = true)
public class Person {

    private String name;

    private int age;
}

那么就可以针对该实体进行如下链式编程操作

new Person().setAge(25).setName("张三")

你可能感兴趣的:(java,java)