Type and variables
基本数据类型
-
int long Boolean double char
- 只有值,没有id
- 不可变的、在栈中分配内存
- 对象数据类型
-
Classes interfaces arrays enums annotations
- 既有id也有值
- 有的可变有的不可变、在堆中分配内存
-
所有对象均继承于object类
操作
-
操作是把输入映射到输出的函数
- 操作符:
Int × int → int
- 方法:
biginteger × biginteger → biginteger
- 函数:
Sin: double → double
- 操作符:
-
操作符重载
-
方法重载
静态类型检查与动态类型检查
- 类型转换:
- 隐式:Double a= 2
- 强制: int a = (int) 18.7;
-
类型不匹配错误:int a = 18.7; 不匹配类型
-
Java是静态类型语言
- 所有量的类型在编译时(在程序运行之前)是已知的,因此编译器也可以推断所有表达式的类型
- 在编译阶段进行类型检查
- 类型不匹配
- 操作应用在错误类型的参数
- 语法错误
- 类名,函数名拼写错误
- 参数数目错误
- 参数类型错误
- 返回值类型错误
-
动态类型检查会检查越界和空指针
- 静态检查→关于“类型”的检查,不考虑值
- 动态检查→关于“值”的检查
可变性和不可变性
-
改变一个变量:将该变量指向另一个值的存储空间
-
改变一个变量的值:将该变量指向的存储空间写入一个新值
尽可能避免变化,以避免副作用
不变性
-
不变数据类型:一旦被创建,其值不能改变
-
不可变引用:一旦确定指向的对象,不能再被改变
-
不变对象 : 一旦被创建,始终指向同一个值/引用
-
使用
final
关键字- final类无法派生子类
- final变量不发修改值/引用
- final方法无法
-
String 是不可变类型
- 一旦被创建,总是只有一个值
- 每次基于旧串更改,都需要创建一个新串
- 相对应的StringBuilder 为可变类型 -->> 可以删除子串、插入或替换字符(基于原对象)
-
使用不可变类型,频繁修改会产生大量的临时拷贝(需要进行垃圾回收)
-
可变类型最少化拷贝会提高效率 、可以提高性能、也适合在多个模块间共享数据
-
不可变性更加安全、在其他质量指标上表现更好
-
当传递可变对象时候,方法可能会修改对象的值,导致后续的错误
-
当返回可变对象时也可能会导致错误
- 使用防御式拷贝,给客服端返回一个全新的对象
- 不过大部分时间该拷贝不会被客服端修改,可能会造成大量的内存浪费
- 如果使用不可变类型则节省了频繁拷贝的代价
- 使用防御式拷贝,给客服端返回一个全新的对象
别名使得可变类型具有风险
- 局部变量不会涉及共享,只有一个引用很安全
- 多个引用指向同一个可变对象,则会很不安全