数据类型和类型检查
一、数据类型
1、基本类型
2、对象类型
注:基本类型以小写字母开头;对象类型以大写字母开头。
二、动态检查和静态检查
1、静态检查
静态检查在编译时检查错误;
静态检查可以检查语法的错误:如额外的标点符号或者虚假词语。
静态检查函数的名称,参数的数量,参数的类型,错误的返回类型。
2、动态检查
动态检查在运行后检查错误;
非法的参数值:例如x/y 当y等于零的时候,才发生错误,所以这不是一个静态错误而是一个动态错误。
不可表示的返回值,即特定的返回值无法在类型中表示时。
赋值超出范围。
调用空对象的方法。
3、静态与动态检查的比较
静态检查往往是关于类型的,与变量具有的特定值无关的错误。
静态类型保证了一个变量会从该集合中获得一些值,但是我们直到运行时才知道它具有哪个值。
所以如果错误只会被某些值引起,比如被零除或索引超出范围,那么编译器不会引发关于它的静态错误。
相比之下,动态检查往往是由特定值引起的错误。
三、Mutable和Immutable
1、对象是不可变的:一旦创建,它们总是表示相同的值。
字符串是不可变类型的一个例子。
一个String对象总是表示相同的字符串。
由于String是不可变的,一旦创建,String对象始终具有相同的值。
要将某些内容添加到字符串的末尾,必须创建一个新的String对象。
2、对象是可变的:它们有改变对象值的方法。
StringBuilder是一个可变类型的例子。
它有方法删除部分字符串,插入或替换角色等。
该类具有更改对象值的方法,而不仅仅是返回新值。
3、只有一个对象的引用时,可变性和不变性之间的区别并不重要。但是,当对象存在其他引用时,它们的行为方式会有很大差异。例如,当另一个变量t指向与s相同的String对象,而另一个变量tb指向与sb相同的StringBuilder时,则不可变对象和可变对象之的区别变得更加明显。
4、immutable传递变量的时候传递的是值,而mutable传递的是引用
四、防御式拷贝
五、Snapshot diagram
1、原始值由裸常量表示。 传入的箭头是对来自变量或对象字段的值的引用
2、对象值是由其类型标记的圆。 当我们想要显示更多细节时,我们在其中写入字段名称,箭头指向它们的值。 有关更详细的信息,这些字段可以包含它们的声明类型。 有些人更喜欢写x:int而不是int x,但都可以。
3、不变对象(它们的设计者打算始终表示相同的值)在快照图中用双边框表示,就像我们图中的String对象一样。
4、不可变引用(最终)由双箭头表示。
六、数组及其他的数据类型
1、数组
int []a=new int [100]
2、list
List<Integer> list = new ArrayList<Integer>()
索引:list.get(2); 赋值:list.set(2,0);长度:list.size()。
list是一个界面。
3、set
set是零个或多个唯一对象的无序集合。
s1.contains(e)测试集合是否包含元素。
- s1.containsAll(s2)测试是否s1⊇s2。
- s1.removeAll(s2)从s1中删除s2。
set是一个抽象的接口
4、map
一个 地图 类似于字典(键值)
map.put(key,val) 添加映射键→val
map.get(key) 获取钥匙的价值
map.containsKey(key) 测试地图是否有**
map.remove(key) 删除一个映射
▪ 地图 是一个抽象界面
七、空引用
在Java中,对对象和数组的引用也可以采用特殊值Null,这意味着引用不指向对象。空值是Java类型系统中的一个不幸的漏洞。
原始元素不能为空,编译器将拒绝具有静态错误的此类尝试:
int size = null; //非法
可以将null分配给任何非原始变量,并且编译器在编译时高兴地接受这些代码。但是你会在运行时遇到错误,因为你无法调用任何方法或使用带有这些引用之一的任何字段(throwsNullPointerExceptions):
String name = null; name.length();
int [] points = null; points.length;
null与空字符串“”或空数组不同。
像List这样的非原语和集合的数组可能没有null,但包含null作为值
只要有人尝试使用集合的内容,这些空值可能会导致错误
空值是麻烦和不安全的,所以建议将它们从设计词汇中删除。
空值在参数和返回值中被隐式禁止