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;
}
}