Java面试题:final修饰的对象,有几种初始化方式

final修饰的对象初始化时分两种情况:

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

  • 1,在定义变量时直接赋值
  • 2,声明完变量后在构造方法中为其赋值
  • 3,声明完变量后在构造代码块中为其赋值

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

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

下面我们建立一个例子看看详细情况:

public class TestFinal {

//    一、使用Final修饰符修饰的类的特点:该类不能有子类;
//
//    二、使用Final修饰符修饰的对象的特点:该对象的引用地址不能改变;
//
//    三、使用Final修饰符修饰的方法的特点:该方法不能被重写;
//
//    四、使用Final修饰符修饰的变量的特点:该变量会变成常亮,值不能被改变。

    //-----------------成员变量------------------//
    //初始化方式一,在定义变量时直接赋值
    private final int i = 5;
    private final SysUser sysUser = new SysUser();
    private final Book book = new Book();

    //初始化方式二,声明完变量后在构造方法中为其赋值
    //如果采用用这种方式,那么每个构造方法中都要有j赋值的语句
    private final int j;
    private final Book book1;

    public TestFinal() {
        j = 5;
        book1=new Book("三国演义","罗贯中");
//        book=book1;
//        book.setName("111");
//        book.setAuthor("2222");
    }

    //如果取消该构造方法的注释,程序就会报错,因为它没有为j和book1赋值
    /*public TestFinal(String str) {

    }*/
    public TestFinal(String str) {
        // 为了方便我们可以这样写
        this();
    }


    //下面的代码同样会报错,因为对j重复赋值
//    public TestFinal(String str1, String str2) {
//        this();
//        j = 3;
//    }


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

    {
        k = 5;
        book2 = new Book("红楼梦","曹雪芹");
    }

    //-----------------类变量(静态变量)------------------//
    //初始化方式一,在定义类变量时直接赋值
    public final static int p = 5;
    public final static Book book3 = new Book("水浒传","施耐庵");

    //初始化方式二,在静态代码块中赋值
    //成员变量可以在构造函数中赋值,但是类变量却不可以。
    public final static int q;
    public final static Book book4;

    static {
        q = 5;
        book4 = new Book("西游记","吴承恩");
    }

    //因为成员变量属于对象独有,每个对象创建时只会调用一次构造函数,
    //因为可以保证该成员变量只被初始化一次;
    //而类变量是该类的所有对象共有,每个对象创建时都会对该变量赋值
    //这样就会造成变量的重复赋值。

}
posted @ 2019-07-08 00:40  nextsummer  阅读(6561)  评论(1编辑  收藏  举报