3.1数据类型与类型检验

3.1Data Type and Type Checking数据类型与类型检验

1. 静态/动态类型检查

2. 可变/不变的数据类型

3. 可变数据类型的危险性

4. 不变数据类型的优越性

5. 用snapshot图理解数据类型

6. 用集合类表达复杂数据类型

7. 知道Null reference的危害并避免它

 

 

1 Data type in programming languages数据类型

 

primitive types 基本数据类型

object types 对象数据类型

 

 

1.Object类型是所有对象类型的父类

2.基本类型可以包装为对象类型,通常在定义集合类型的时候使用他们

3.重载overloading 同样的操作名可用于不同类型

 

 

2 Static vs. Dynamic data type checking静态和动态代码分析

 

Java是静态类型语言,在编译阶段进行类型检查

动态类型语言在运行阶段进行类型检查

无检查:语言不帮你检查,自己看

静态类型检查 >> 动态 >> 无检查

 

1.静态类型检查:可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性 /健壮性

可检查出的错误:

语法错误(标点符号啥的);类名函数名错误(ex:Math.sine(30,20) 应该是sin)

参数数目错误( ex:Math.sin(30,20) );参数类型错误(Math.sin("30"))

返回值类型错误

 

2.动态类型检查

可检查出的错误:

非法的参数值(ex:/0错误);非法的返回值;越界;空指针

 

 

 

静态检查:关于“类型”的检查,不考虑值

动态检查:关于“值”的检查

 

一些样例:

1为静态检查235为无错误只是答案不正确 4为动态检查

 

 

 

Mutability and Immutability可变性和不可变性

改变一个变量:将该变量指向另一个值的存储空间

改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。

 

不变性:重要设计原则

不变数据类型:一旦被创建,其值不能改变

如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变(加上final关键字)

 

不可变数据类型需要频繁的垃圾回收,可变数据类型有时效率更高。但前者更安全

 

Risk:在参数传入mutable的数据类型然后更改,或者返回可变的数据类型可能出现风险,在用户端被更改。 解决:防御式拷贝(创建新的对象)或者直接使用不可变数据类型。

 

4.4 Snapshot diagram as a code-level, run-time, and moment view

 

Snapshot图用于描述程序运行时的内部状态,刻画各类变量随时间变化。

 

如何画snapshot:

1.基本类型的值

 

2.对象类型的值

 

3.不可变对象:用双线椭圆表示

 

4.可变的对象

 

5.不可变的引用 (final),不可变的引用:用双线箭头

 

PS:引用是不可变的,但指向的值却可以是可变的;可变的引用,也可指向不可变的值

 

练习:

ex1:

 

 

ex2:

 

 

 

 

5 Complex data types: Arrays and Collections复杂数据类型

 

数组:固定长度

 

List:长度可变的类型

 

Set:无序的,含有0个或多个独一无二的对象

 

Set是一个抽象接口

 

Map:类似字典,可以从key的值得到value

 

 

从数组中构建

 Arrays.asList(new String[] { "a", "b", "c" })

 

Iterator迭代器

有next()方法得到下一个元素

有hasNext()方法确认是否到collectiion的最后

 

 

6 Useful immutable types有用的不可变类型

基本类型及其封装对象类型都是不可变的

Collections提供了一些包装器来得到不可变的collection

 

 

 

PS:!!! 但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查

编译阶段修改不会报错,运行时报错

不可变collections的静态方法

List.of   Set.of     Map.of

 

 

7 Null references空引用

基本类型不能为空,编译器会报错

 null可以作为值使用,但最好不要这样做

ex: list.add(null);

 

 

非基本类型可以为null,但是不能使用方法或属性 (throws NullPointerExceptions)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值