1.基本数据类型、对象数据类型
1)基本数据类型:int,long,boolean,double,char ⇒小写
2)对象数据类型:String,BigInteger⇒大写
基本数据类型 | 对象数据类型 |
---|---|
没有ID,只有值 | 既有ID,又有值 |
在栈中分配内存 | 在堆中分配内存 |
不可变 | 有些可变,有些不可变 |
代价低 | 代价昂贵 |
对象形成继承的层次关系,继承树根节点为Object
2.静态类型检查和动态类型检查
⇒静态类型语言:在编译阶段进行类型检查
⇒动态类型语言:在运行阶段进行类型检查
⇒静态类型检查:在程序运行前自动发现bug,在编译时发现问题
⇒动态类型检查:在程序运行时自动发现bug
⇒无检查:不进行检查,自己对自己代码负责
⇒静态类型检查的范围:(“类型相关”)
1)语法错误
2)类名/函数名错误
3)参数数目错误
4)参数类型错误
5)参数返回值类型错误
⇒动态类型检查:(”值相关“)
1)非法的参数值(如除零错误)
2)非法的返回值
3)越界(数组)
4)空指针
3.Mutable/Immutable
⇒改变一个变量:将该变量指向另一个存储空间
⇒改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新值
⇒Immutability不变性
⇒不变数据类型:一旦被创建,其值不能被改变
⇒引用类型:也可以是不变的,一旦确定其指向对象,不能再被改变
⇒final关键字:若Java编译器不能确定final不变量不会改变,就提示错误,这也是静态检查的一部分
⇒final类:无法再产生子类
⇒final变量:无法改变值/引用
⇒final方法:无法被子类重写
⇒可变对象:拥有方法可以修改自己的值/引用
⇒不变对象:一旦被创建,始终指向同一个值/引用
⇒String:不可变类型
⇒StringBuilder:可变类型
⇒有删除/添加/替换方法–修改自己
⇒可变类型的优点
1)使用不可变类型,对其频繁修改会产生大量的临时拷贝
2)可变类型可以最小化拷贝以提高效率
3)可以获得更好的性能
4)适合于在多个模块之间共享数据
⇒不可变类型更安全,更好理解,对改变的支持也更好
⇒常见可变类型:StringBuilder,Date,List<>
⇒常见不可变类型: LocalDateTime,Instant,基本类型及其封装类型
unmodifiableList;unmodifiableSet;unmodifiableMap:不可改变,只能看
⇒它们接收一个List/Set/Map包装为一个不可变List
⇒这种不可变是在运行时获得的,而非编译时