final修饰类、变量、方法

final 修饰类、方法、变量,表示不可变的
final 修饰变量:不可变,必须赋初值。

  • final成员变量:必须由程序员显示的指定初始值
    成员变量随着类或对象的初始化而初始化。当执行静态初始化块时可以对类变量赋初始值;当执行普通初始化块构造器时可对实例变量赋初始值。
    final修饰的实例变量,要么在定义该实例变量时执行初始值,要么在普通初始化块构造器中为该实例变量指定初始值。
    final修饰的类变量,要么在定义该类变量时指定初始值,要么在静态初始块中为该类变量指定初始值。
    尽量不要在final变量显示初始化之前访问它。
    在这里插入图片描述
  • final局部变量:系统不会对局部变量进行初始化,必须由程序员显示初始化。不能对形参赋初值。
    在这里插入图片描述
  • final 修饰基本类型变量引用类型变量的区别
    修饰基本类型变量:只能赋值一次
    修饰引用类型变量:只要它所引用的地址不变,即一直是这个对象,但对象的属性可以变化。以下代码合法。
    final Person p = new Person();
    p.setAge(23);
  • 可执行“宏替换”的final变量
    满足的条件:
    (1)使用final修饰符修饰
    (2)定义该final变量事制定了初始值
    (3)该初始值可以在编译时被确定下来
    编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
    eg: final in a = 5;
    System.out.println(a);
    运行时,变量a根本不存在,直接执行System.out.println(5)
    常量池来管理用过的字符串直接量:String a = “Java”;
    String b = “Java”.此时,a和b都指向常量池中的"Java"字符串。
  • final方法: 不能被重写(子类不能重写父类的方法)。
    Java提供的Object类里有一个final方法:getClass()方法。
    方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
    方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型。
    final修饰的方法不能被重写,但是能被重载。

final类 :final修饰的类不能有子类。

不可变类 :指创建该类的实例后,该实例的实例变量是不可改变的。
创建自定义的不可变类,遵守以下规则:
(1)使用private 和final修饰符来修饰该类的成员变量
(2)提供带参数构造器,用于根据传入参数来初始化类里的成员变量。
(3)提供getter()方法,不提供setter方法。
(4)如果有必要,重写Object类的hashCode()方法和equals()方法。保证equals()相等时,hashCode()也相等。

  • 如果需要这几一个不可变类,需要注意引用类型的成员变量,如果引用类型的成员变量的类是可变的,就需要采取措施保护成员变量所引用的对象不会被修改。
    缓存实例的不可变类
    不可变类的实例状态不可变,可以方便被多个对象所共享。如果程序中经常使用相同的不可变类实例,则考虑缓存这种不可变类的实例。如果缓存池已满,则采用“先进先出”的规则决定哪个对象被移除缓存池。
    Integer in1 = new Integer.valueOf(6);生成Integer对象,并缓存该对象,只缓存-128 ~~127之间的Integer对象。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值