第四章 数据类型和类型检查

一.编程语言中的数据类型
1.一个类型是一组值,以及可以对这些值进行的操作
2.变量:用特定数据类型定义,可存储满足类型约束的值
3.基本数据类型:int,long,boolean,double,char…
对象数据类型:String,BigInteger …
4.ID就是指向内存的引用在这里插入图片描述
int和char是没法用一个统一的类型表示的,但对象数据类型可以用泛型表示统一的类型
5.对象类型形成层次结构(继承关系,可以override方法)
6.包装类型
(1)将基本类型包装为对象类型,通常是在定义集合类型的时候使用它们,一般情况下尽量避免使用,一般可以自动转换
7.操作
(1)操作是接受输入并产生输出
8.重载
(1)同样的操作名可用于不同的数据类型
二.静态与动态数据类型检查
1.静态类型检查:编译阶段就知道变量的类型,在运行之前就检查
2.动态类型检查:在运行阶段进行检查
3.静态>动态>无检查
4.静态检查能检查出的错误:语法错误;类名、函数名错误;参数数目错误;参数类型错误;返回值类型错误
5.动态检查能检查出的错误:非法的参数值(例如除数为0)、非法的返回值(特定返回值不能在类型中表示)、越界、空指针
注:静态检查往往根据“类型”;动态检查针对“值”
注:数值溢出(如200000*200000会返回一个错误值)既不是静态检查也不是动态检查,对-9开根号返回NaN,不是动态检查
在这里插入图片描述
第一个是静态检查;第2,3,5个都是第三种情况;第4个如果直接是n=0,静态就有可能检查出来,如果n=一个操作的值,最后算出这个操作值为0的话就是动态检查
三.Mutability 和 Immutability
1.改变一个变量:将该变量指向另一个值的存储空间, 改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值
2.final定义是无法改变指向,如果编译器无法确定final变量不会改变,就提示错误,这也是静态类型检查的一部分,用final定义的变量是immutable的,就是不能改变指向
3.尽量使用final变量作为方法的输入参数、作为局部变量
4.final:final类无法派生子类;final变量无法改变值/引用;final方法无法被子类重写
5.不变对象:一旦被创建,始终指向同一个值/引用;可变对象:拥有方法可以修改自己的值/引用(可变类:有方法可以改变其内部变量)
immutable要想改变变量必须新创建一个对象
例如:String是immutable类型 -> StringBuilder是mutable类型
6.两者比较:当只有一个引用指向该值,没有区别;有多个引用的时候,差异就出现了
在这里插入图片描述

7.Advantage of mutable types:使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收);可变类型最少化拷贝以提高效率;使用可变数据类型,可获得更好的性能;也适合于在多个模块之间共享数据
在这里插入图片描述
trim( )方法返回:一个删除了前导和尾部空白的字符串的副本,如果没有前导和尾部空白,则为该字符串。
8.Advantage of immutable types:不可变类型更“安全”,在其他质量指标上表现更好(需要折中),可变性难以理解程序在做什么,更难满足方法的规约
9.mutable类型的风险
(1)改变了参数的值
(2)返回值时会遇到值被改变的风险
风险防范:
(1)通过防御式拷贝,给客户端返回一个全新的对象,(大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费)
(2)使用不可变类型,不需要防御式拷贝
(3)安全的使用可变类型:局部变量,不会涉及共享;只有一个引用;如果有多个引用(别名),使用可变类型就非常不安全(ppt P37–P44)
四.Snapshot diagrams
(1)用于描述程序运行时的内部状态
(2)便于刻画各类变量随时间变化
(3)规范:
基本类型 :箭头下面直接写值在这里插入图片描述对象类型:画个圈,箭头指向圈,圈中写类的值,其中的成员变量再箭头直接赋值
在这里插入图片描述
注:可变对象用单线椭圆,不可变对象用双线椭圆
不可变的引用用双箭头
引用是不可变的,但指向的值却可以是可变的(final StringBuilder sb,这个sb本身的值可以改变) P54-P55
可变的引用,也可指向不可变的值(String s,s可以是不可变的)
五.数组和容器类
1.List变长数组 List list = new ArrayList()
List是一个接口,表示是一个变长数组,后面new的是实现形式ArrayList
list.get(2),list.set(2,0),list.size()
List中的成员必须是对象
2.Set(集合)->无序,不重复
Set也是个抽象接口,和List一样。Set set=new HashSet
3.Map(键值对) key-value 也是个抽象接口
map.put(key, val),map.get(key) ,map.containsKey(key), map.remove(key)
注:List Set Map都是只告诉我们方法定义和一些基本功能,并没有告诉我们具体实现是什么样的,方法声明和具体实现分开->基本思想
4.迭代器
(1)迭代器是一个对象,遍历一组元素并逐个返回
在这里插入图片描述
(2)next()和hasNext()
在这里插入图片描述
此程序中由于List是mutable类型的,所以这三者是针对同一个对象

六.Useful Immutable Types
1.基本类型及其封装对象类型都是不可变的(int-Integer)
2.List,Set,Map是mutable的,可以包装成不可变的类型Collections.unmodifiableList,包装后结果不可变,.add()…都会抛出异常
3.但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查
4.immutable类型静态方法List.of, Set.of, Map.of

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值