final修饰的对象,有几种初始化的方式

final修饰的对象,有几种初始化的方式

final修饰的对象初始化分两种情况考虑

第一种:修饰成员对象时有3种初始化方式

  • 修饰成员变量时直接赋值
  • 声明完变量后在构造方法中为其赋值
  • 声明完变量后在构造代码块当中为其赋值

第二种:修饰类对象(静态对象)

  • 在定义类变量直接赋值
  • 在静态代码块中直接赋值

代码解析

package com.liqh;

public class TestFinal {

    /**
     *1、使用final修饰的类的特点:该类不能有子类
     *2、使用final修饰的对象的特点:该对象的应用地址不能改变
     *3、使用final修饰的方法的特点:该类方法不能被重写
     *4、使用final修饰的变量的特点:该变量会变成常量、值不能被改变
     *
     */
    
    //初始化方法1、在定义变量时直接赋值
    private final int i=10;
    private final AuthorUser user = new AuthorUser();

    //初始化方式2、声明完变量后在其构造方法为其赋值
    //如果采用这用方式、那么每一个被final修饰的变量都要在构造方法中赋值。

    private final int j;
    private final AuthorUser author;

    public TestFinal(){
        j=20;
        author = new AuthorUser();
    }

    public TestFinal(String book){
       this();
    }

    //初始化方式3、声明完变量后在构造代码块中为其赋值
    //如果采用此方式,就不能在构造方法中再次为其赋值
    //构造代码块中的代码会在构造函数之前执行,如果在构造函数中再次赋值,
    //就会造成final变量的重复赋值

    private final int k;
    private final AuthorUser authorUser1;

    {
        k=10;
        authorUser1 = new AuthorUser("西游记","吴承恩");
    }

    //因为成员变量属于对象独有,每个对象创建时只会调用一次构造函数,
    //因为可以保证该成员变量只被初始化一次;
    //而类变量是该类的所有对象共有,每个对象创建时都会对该变量赋值
    //这样就会造成变量的重复赋值。
    private final static int q;
    private final static AuthorUser authorUser2;
    static {
        q=10;
        authorUser2 = new  AuthorUser("红楼梦","曹雪芹");

    }

}

package com.liqh;

public class AuthorUser {
    private String bookName;
    private String author;

    public AuthorUser() {

    }
    public AuthorUser(String bookName, String author) {
        this.bookName = bookName;
        this.author = author;
    }
    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

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