final总结

final修饰变量

  • 成员变量
  1. 类变量(static修饰的变量

赋初值:

  1. 声明变量的时候直接赋初值
  2. 静态代码块中赋初值
  1. 实例变量

赋初值:

  1. 声明变量的时候给实例变量赋初值
  2. 非静态初始化块中赋初值
  3. 构造器中赋初值
  • 局部变量

赋初值:

显式初始化,已经进行了初始化则后面就不能再次进行更改,如果final变量未进行初始化,可以进行赋值,当且仅有一次赋值,一旦赋值之后再次赋值就会出错

final基本数据类型 VS final引用数据类型

  1. 当final修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变。
  2. 而对于引用类型变量而言,它仅仅保存的是一个引用,final只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的

宏变量:利用final变量的不可更改性,在满足一下三个条件时,该变量就会成为一个“宏变量”,即是一个常量。

  1. 使用final修饰符修饰;
  2. 在定义该final变量时就指定了初始值;
  3. 该初始值在编译时就能够唯一指定。

重写? 

被final修饰的方法不能够被子类所重写

public class FinalExampleParent {
    public final void test() {
    }
}

重载?

1. 父类的final方法是不能够被子类重写的

2. final方法是可以被重载的

 

public class FinalExampleParent {
    public final void test() {
    }

    public final void test(String str) {
    }
}

当一个类被final修饰时,表名该类是不能被子类继承的。子类继承往往可以重写父类的方法和改变父类属性,会带来一定的安全隐患,因此,当一个类不希望被继承时就可以使用final修饰。还是来写一个小例子:

public final class FinalExampleParent {
    public final void test() {
    }
}

父类会被final修饰,当子类继承该父类的时候,就会报错,如下图:

 

final经常会被用作不变类上,利用final的不可更改性。我们先来看看什么是不变类。

不变类

不变类的意思是创建该类的实例后,该实例的实例变量是不可改变的。满足以下条件则可以成为不可变类:

  1. 使用private和final修饰符来修饰该类的成员变量
  2. 提供带参的构造器用于初始化类的成员变量;
  3. 仅为该类的成员变量提供getter方法,不提供setter方法,因为普通方法无法修改fina修饰的成员变量;
  4. 如果有必要就重写Object类 的hashCode()和equals()方法,应该保证用equals()判断相同的两个对象其Hashcode值也是相等的。

JDK中提供的八个包装类和String类都是不可变类,我们来看看String的实现。

/** The value is used for character storage. */
 private final char value[];

可以看出String的value就是final修饰的,上述其他几条性质也是吻合的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值