3.1 基本数据类型、对象数据类型
基本数据类型 | 对象数据类型 |
---|---|
int,long,boolean,double,byte,short,float,char(单个字符如’A’) | 类,接口,数组,枚举,注释(String:一系列字符,BigInteger:任意大小整数) |
价值不可变(Mutability) | 有的价值可变,有的不可变 |
小写 | 大写字母开头 |
使用成本低 | 成本高 |
无法实现表达的统一 | 表达和泛型一致 |
3.1.1 对象的层次结构
Object类是所有类的基类,所有类都默认继承Object类。
3.1.2 基本数据类型的包装类
将基本数据类型封装为对象
Boolean, Integer, Short, Long, Character, Float, Double
在编译时语言会对基本数据类型和包装类进行自动转换
如图示例:
3.1.3 运算符和操作
运算符加减乘除和’=’,运算优先法则与C语言中一样,String类中’+'代表将字符串连接。
操作:操作是接受输入和产生输出的功能(有时会更改值本身)
三种形式:
- 作为前、中、后缀操作符
- 对作为对象的方法,如:bigint1.add(bigint2),调用操作add
- 作为一个函数功能,如:Math.sin(theta),调用操作sin
3.1.4 运算符和操作
相同操作名称用于不同的数据类型。
3.1.5 复杂的数据类型
-
Arrays:
Array数组:固定长度 List:可变长度,接口 Set:抽象接口 Map:抽象接口 List、Set、Map的成员必须是对象。
- 迭代器:可变类型
两种形式
3.2 静态类型检查、动态类型检查
3.2.1 静态与动态数据类型
- 静态数据类型:编译期间做检查数据类型的语言,即写程序时要声明所有变量的数据类型,是固定的。使用数据之前,必须先声明数据类型(int ,float,double等)。相当于使用之前,首先要为它们分配好内存空间。
- 动态数据类型:运行期间才做数据类型检查的语言,即动态类型语言编程时,永远不用给任何变量指定数据类型。该语言会在第一次赋值给变量时,在内部将数据类型记录下来
Java是静态类型语言,编译器可以根据已知的变量类型推断出所有表达式的类型,而且IDE支持输入时语法检查。
3.2.2 类型检查
-
静态类型检查:针对类型
编译时检查错误, 避免因使用错误类型的操作而导致的bug。语法检查、名称检查、参数数量和类型检查、返回值类型检查
-
动态类型检查:针对特定值
运行时检查。(但是Java不会检查)非法参数值:如分母为0 非法参数:不可返回的数据类型 超出范围的索引:如数组越界 调用空对象的方法:空指针
3.3 Mutable/Immutable
-
不可变性:比较安全。
(1) 不可变数据类型:一旦一个数据类型(对象)被创建并且初始化。这个数据类型的值就不会变化,有关它的方法都不是改变该数据类型本身,而是重新创建了一个新的数据类型。
(2) 不可变引用:指定引用位置后不可再次指定,使用final。final类: 1. 不能被继承 2. 始终包含相同的值/引用,不能更改 3. 不能被子类重写
(3)例:不可变数据类型String在“a”末尾添加后缀“b”,需要重新新建一个String
(4)List、Set、Map和BigDecimal、BigInteger使不可变数据类型。
- 可变性:可以改变变量值。不太安全,但相比不可变类型,进行操作时使用空间小,而且做全局 变量,方便共享。例:可变类型StringBuilder
“a”加后缀“b",直接改变变量值。
3.4 值的改变、引用的改变
改变引用:改变指向对象的指针
改变值:改变指针下所指的对象
String类型下进行操作后:t、s由刚开始指向相同引用,进行操作改变引用,指向不同的对象,所以最终数值不同,而StringBuilder指向相同的对象,进行做后改变的是指针下的值,而没有改变引用,所以值相同。
3.5 防御式拷贝
为对象返回新副本,以避免可变类型带来的危害。但会占用额外的空间。
(1) 修改构造器,对实例中每个可变的参数进行防御性拷贝
3.6 Snapshot diagram
快照图表示程序在运行时的内部状态。如正在进行的方法及局部变量,以及当前存在的状态。
- 基本数据类型值
- 对象值:有圆圈,以下都对。
- 不可变类型:双边框
- 可变类型:单边框
- 不可变量引用:双箭头