HIT软件构造课程复习——第三章ADT&OOP第一节数据类型和数据检查

3.1数据类型和数据检查

主要内容:

1.了解数据类型的基本知识,以及编程语言中的静态和动态类型检查,尤其是Java。

2.理解可变性和可变对象

3.识别混叠和了解易变的危险

4.使用不变性来提高正确性、清晰度和可变性

5.使用快照图演示程序执行期间特定时间的状态

6.使用数组和集合来处理复杂的数据类型

7.了解null的危害并加以避免

一、编程语言中的数据类型

1.一种数据类型是一组值,以及可以对这些值执行的操作。

2.变量是存储某一特定类型的值的已经被命名的位置。

3.Java数据类型:

a.基本数据类型:如int、long、boolean、double、char,等等(按照Java惯例以小写字母开头)除了值以外没有其他识别方式(即int a=1;int b=1;那么(a==b)is true),存储在栈上只有使用时才存在,不能实现表达的统一性,使用起来代价非常低廉。

b.对象数据类型:如String、BigInteger等等(按照Java惯例以大写字母开头),具有自己独特的身份,即使值相等也不一定可以使==判定为true(比如String a=“ABC”;String b=“ABC”;但是a==b不为true)。存储在堆上,通过垃圾回收机制销毁,表达与泛型统一,使用起来具有较高的花费。

4.对象类型的层次结构:

Java可以说是一门万物皆对象的语言,除了基本数据类型以外,其他都是对象,Java具有一个Object,是众类鼻祖,一个类如果没有明确写出继承哪一个类,那么就默认继承Object类。一个类是他父类的一个实例,子类从父类继承可见的变量和方法,并且可以重写父类已经实现的方法。

5.基本数据类型的包装类:

Java基本数据类型也可以包装成对象数据类型,比如Boolean, Integer, Short, Long, Character, Float, Double,这种类型应用于集合当中,但是不是万不得已不要使用这种包装类,因为他的效率较低,编译器会对这种类型进行自动的包装与解包装,这回降低效率。

6.操作符:就像数学当中的操作符一样,+-*/=(),按照数学规则进行使用即可。(“+”也可以连接两个字符串)

7.重载运算符和操作:

重载就是使用相同的操作,但是操作的对象不同,编译器根据你要操作的对象自动选择该用什么方法进行操作。操作符和方法都可以重载。

二、静态数据类型与动态数据类型

Java是一种静态类型的语言,所有变量的类型在编译时(程序运行之前)都是已知的,因此编译器也可以推断所有表达式的类型。

如果a和b声明为int,则编译器得出结论,a +b也是int。

三、类型检验

1.静态检查和动态检查:

静态检查:在程序运行之前就会自动发现错误,避免因使用错误类型的操作而导致的bug。

动态检查:在执行代码时会自动发现错误。例如,整数表达式x/y只有在y实际上为零时才是错误的,否则它会工作。因此,在这个表达式中,除以零不是静态错误,而是动态错误。还有数组越界,调用空指针等。

静态检查通常是关于类型的,这些错误独立于变量所具有的特定值。相比之下,动态检查往往是由特定值引起的错误。

四、可变性和不可变性

1.改变变量和改变值有什么区别?

当你赋值给变量时,你正在改变变量的箭头所指向的位置,你可以把它指向一个不同的值。当您为可变值的内容赋值时,例如数组或列表,你在那个值里面改变引用。

2.不变性: 不变数据类型创建完后,值不可修改, 不变引用,一旦指定引用位置,不可再次指定,要使引用不可变,请使用关键字Final声明它。使用final声明方法的参数和局部变量是很好的做法。与变量的类型一样,这些声明是重要的文档,对于代码的读者和编译器的静态检查都很有用。

notes:

final类不可继承。final变量包含相同的值或者引用但是不可以被修改。final方法不可以被子类重写。

3.String是不可变类型,一旦创建就代表一个字符串,要想改变他的值只能新建一个字符串,StringBuilder是一个可变类型,可以再原对象基础上进行修改,而不必新建一个对象。


当只有一个对象引用时,可变性和不可变性之间的区别并不重要,但是,当有其他对象的引用时,它们的行为有很大的不同。例如,当另一个变量t指向与s相同的字符串对象,而另一个变量TB指向与SB相同的StringBuilder时,则不可变和可变o之间的差异点变得更明显。

4.可变类型的优点:获得良好的性能是我们使用可变对象的原因之一。另一个是方便共享:程序的两个部分可以通过共享常见的可变数据结构来更方便地进行通信。

5.可变类型的风险:不可变类型在bug中更安全,更容易理解,更容易适应变化。不可变性可能比可变性更有效,因为不可变类型永远不需要进行防御式复制。

五、快照图

为了理解微妙的问题,我们可以画出运行时正在发生的事情。快照图表示程序在运行时的内部状态-它的栈(正在进行中的方法及其局部变量)和它的堆(当前存在的对象)。快照图给了我们一种将更改变量和更改值的区别可视化的一种方法,基本数据值由裸常量表示,传入箭头是对变量或对象字段的值的引用。

对象值是由其类型标记的圆。当我们想要显示更多细节时,我们在其中写字段名,箭头指向它们的值。

不可变对象(由其设计器用于始终表示相同的值)在快照图中以双边框表示,就像图中的字符串对象一样。

在快照图中,不变的引用(final)由双箭头表示。这里有一个标识永远不变的对象(它不能被重新分配到一个不同的数字),但是它的年龄可以改变。

六、复杂数据类型:数组和集合

1.数组 

int[]数组类型包含所有可能的数组值,但是一个特定的数组值一旦创建,就永远不会改变其长度。

2.列表

列表是一种可变长度序列.列表是一个接口。列表中的成员必须是对象。

3.集合

集合是零个或多个唯一对象的无序集合。对象不能多次出现在集合中。集合是一个抽象接口。

4.映射

Map类似于字典(键-值对)。map是一个抽象接口

使用Java的collection接口我们可以限制其内的数据类型,添加项时,编译器可以执行静态检查,以确保只添加适当类型的项。然后,当我们取出一个对象,我们保证它的类型将是我们所期望的。我们不可以创建一个基本数据类型的集合!






猜你喜欢

转载自blog.csdn.net/qq_38828473/article/details/80712666
今日推荐