1)数据类型
在Java中数据类型分为两类,分别是基本数据类型和对象数据类型。基本数据类型包括int long float等,有一定编程经验的都会了解;对象数据类型包括String、Integer等。特点是具有继承关系。
二者的具体区别如下图:
可以将基本类型包装为对象类型,但是会降低性能。通常只有遇到<>才会使用,多数情况也会自动转换。
2)静态/动态类型检查
首先要知道的是,Java是一门静态语言,类似于C语言,动态语言的典型代表是Python。
简单来讲,静态和动态的区别就是检查出bug的时间是在程序运行前还是运行后。
静态检查往往检查的是:
1.语法错误,例如多余的标点符号成者错误的关链词,即使在动态类利的语合例如Puthon中也会做汶种检查。
2.错误的名字
3.参数错误
4.错误的返回类型
动态检查往往检查的是:
1.非法的变量值,例如整形变量xy,表达式x/y只有当y=0是才会出错,否期就是正确的。
2.无法表示的返回值。例如最后得到的返回值无法用声明的类型来表示。
3.越界访问,例如在一个字符串中使用一个负数索引
4.使用一个null对象解引用
总结起来就是:静态检查是关于“类型”的检查,不考虑值 ;动态检查是关于“值”的检查
3)可变性与不可变性
不变数据类型:一旦被创建,其值不能改变 ; 如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变指向其他对象。
可以使用final来修饰一个对象,这样对象的引用不可以改变,但引用的对象内部可以改变。若用来修饰一个基础数据类型,则初始化之后不可再赋值。
此外,final类无法派生子,final变量无法改变值/引用 ,final方法无法被子类重写。
常见的如String、Integer等。
可变类型:简单来讲就是如ArrayList等可以改变其引用/值的类型。
1.对于不可变类型,由于不可改变值或引用,每次想要更改值或值的时候,就需要做大量的临时拷贝,造成内存和时间的浪费。而可变类型因为最少化拷贝,可以提高效率。
2.更重要的一点,不可变类型有很好的优点就是比起可变类型更安全。举例,如果返回的是可变类型,一旦在后续处理中发生了不期望的更改,这种错误是非常难以检查的。这就要求我们使用可变类型时要注意,可以使用防御式拷贝、对于容器类数据类型可以使用如Collections.unmodifiableList等方法将其转变为不可变、final修饰等措施。
4)快照图
快照图是一种方便且直观的用来描述程序运行时的内部状态等图,画快照图有如下规则:
1.基本类型的使用箭头表示
2.对象数据类型使用椭圆表示
3. 不可变对象:用双线椭圆
4. 不可变的引用:用双线箭头;引用是不可变的,但指向的值却可以是可变的 ;可变的引用,也可指向不可变的值