Final关键字:
- final 可以修饰变量、方法、类
- 作用:
- final 修饰的基本数据类型不能被二次赋值
- final 修饰的引用类型不能被二次指向
- final 修饰的方法不可被子类重写
- final 修饰的类不可被继承
- final 防止指令重排序,保障一定程度上的线程之间可见性
- 修饰引用类型变量:
- 不可改变引用类型的地址
- 可以改变引用类型变量中的值
-
final int[] arr = new int[]{1,2,3,4,5}; arr[2] = 999; //此操作可执行
- 常量运算:
- 如果进行运算的是两个常量,此时计算数值的大小运算,然后再判断是否满足类型范围,满足之后进行赋值
- ALU算数逻辑单元:
- ACC累加器:
- ACC累加器的大小:与计算机位数相关
- 数据默认计算 32 位数据,而 final 固定了计算位数,不用向上转型为 int
- 作用:进行算数运算、逻辑运算、移位运算
- 基本数据类型的运算:
- 默认转换为 int 类型数据进行计算
- 因为在 ALU 算数逻辑单元中最少占 32 位
- 被 final 修饰之后,会根据数据的类型进行计算,不会默认向上转型为 int 类型,此时可以被同类型变量接收
- ACC累加器:
包装类:
- 定义:满足万物皆对象(针对基本数据类型)
- 目的:节省内存空间
- 基本数据类型不是包装类的简写形式
- 基本类型的包装类:
- int ==> Integer
- char ==> Character
- 自动拆装箱(仅限于包装类):
- 自动装箱:基本数据类型直接转换为引用数据类型
-
int a = 10; //会编译成 Integer b = Integer.valueOf(10); Integer b = a; //自动装箱操作
- 自动拆箱:引用数据类型转换为基本数据类型
- 包装类和基本数据类型会自动拆箱
Integer a = 10; //会编译成:int b = a.intValue(); int b = a; //自动拆箱操作
- 包装类和基本数据类型会自动拆箱
- 128陷阱:
- Integer 类型创建对象时会创建要给大小为 256 的数组,值为 -128 -- 127
- 创建 Integer 对象时,传入的值在 -128 -- 127 之间会返回 Integer 数组中数值相对应的地址
- 如果传入的值超出范围,就会在堆内存中开辟一块新的 Integer 对象存储这个值
- ==:
- 基本数据类型判断的是值是否相等,对应用类型来说判断的是地址是否相等
- Integer 类型数据 == int类型
- 这时会涉及到自动拆箱操作,判断值是否相等
-
Integer a = 10; int b = 10; System.out.println(a == b); // true //因为 a 会进行拆箱操作,再进行值得对比
- equals()方法:
- 在 Object 类中 equals() 方法进行了重写(如下图)
- 调用 equals() 方法,需要传入一个 Integer 类型的数据,如果传入的是整形 int 类型数据,会进行装箱操作进行传值
- 进入到 equels() 方法中又将会把两个 Integer 类型的数据进行拆箱,进行 int 类型值的比较,返回它们的比较结果(true 和 false)
- Integer 类型中 equels() 比较不涉及到地址,只涉及到它们拆箱后的值
- 在 Object 类中 equals() 方法进行了重写(如下图)
封装:
- 作用:隐藏事物的实现细节,对外提供公开的访问方式
- 好处:
- 隐藏事物的实现细节
- 提高代码的复用性
- 提高安全性
- 原则:
- 隐藏事物的属性
- 隐藏事物的实现细节
- 对外提供公开的访问方式