软件构造3-1第一部分

3-1数据类型与类型检验

考试时很多都从3-1考

3.1编程语言中的数据类型

基本数据类型和对象数据类型的最主要区别是存储的位置不同。
基本数据类型直接在中存储了值而不存储变量。对象数据类型是在里存储,不同的对象存储时是分开的。

继承

在这里插入图片描述
语义约束:若b继承了a,则相当于集合a中包含了集合b。

3.2静态与动态数据类型检测

1.Java是一种静态类型语言
所有变量的类型在编译时(程序运行之前)是已知的,因此编译器也可以推断出所有表达式的类型。如果a和b被声明为整型,那么编译器会得出a+b也是整型的结论。实际上,Eclipse环境在您编写代码时就会这样做,这样您就可以在键入时发现许多错误。在编译阶段进行类型检查,而在运行时不会再进行类型的检测
2.在像Python这样的动态类型的语言中,这种检查被推迟到运行时(当程序运行时)。主要针对某个值进行检测。在运行阶段进行类型检测
3.无检查
例:将被除数赋值为0,Java这在静态类型检测是可以通过的(编译时通过),运行时不会直接报错,而是会抛出异常因为Java在运行时不会再进行类型的检测
而动态类型检测会在除数为0时报错,除数为其他正确的时候不报错。
动态类型检测>>静态>>无检查因为动态类型检测能够针对某个值进行检测,而静态类型检测只能检测这个值是不是在类型范围内。
静态类型检测举例:
在这里插入图片描述
静态类型检查:可以在编译阶段发现错误,避免了将错误带入到运行阶段,可以提高程序的正确性/健壮性
静态类型检测:语法错误类型/函数名错误参数数目错误参数类型错误返回值类型错误
动态类型检测:非法的参数值如除数为0、非法的返回值越界空指针
静态检查:关于类型的检查,不考虑值。动态检查:关于的检测。
一定要弄清楚什么事静态、动态检测及区别。

例题
1、
在这里插入图片描述
出错:静态类型检测发现错误(编译阶段),把int赋值给了boolean
在这里插入图片描述
2、
在这里插入图片描述
不出错:没有错误
在这里插入图片描述
3、
在这里插入图片描述
不出错:程序正常执行但是会得到wrong answer因为直接进行了类型转换(1和5都是int类型,计算得到int类型的0,然后转成了double的0.0)
在这里插入图片描述
4、
在这里插入图片描述

出错:因为Java只进行静态类型检测,所以除数为0程序直接报错。
在这里插入图片描述
5、
在这里插入图片描述
不出错,但是因为除数是双精度数,所以会告诉结果是一个无限的值。
在这里插入图片描述

3.3可变性和不可变性

Java中对赋的值进行改变有两种改变方式:改变内存存储区域里的内容==(改变值)和在内存中开另一个区域存储改变后的值然后将变量指向新建的区域(改变变量)==。
改变变量:Immutability不变性
在这里插入图片描述
final类无法派生子类
final变量无法改变值/引用
final方法无法被子类重写

immutable举例:
String是一种不可变类型
在这里插入图片描述
mutable举例:
StringBuilder是一种可变类型
在这里插入图片描述
差别:当只有一个引用指向该值时没有区别,但是有多个引用
在这里插入图片描述
如图,immutable改变t不会影响s,但是mutable改变tb就会改变sb

mutable优点:可以最小化拷贝以提高效率(最大好处)。 也适合于在多个模块之间共享数据。
immutable缺点:对其频繁修改会产生大量的临时拷贝(需要垃圾回收),效率低

举例:打印结果:
1、
在这里插入图片描述
在这里插入图片描述
输出:“== Hello World ==”(不会进行字符串空格的删减)。如图String.trim()的介绍:会删减字符串两边的空格,但是返回的是一个copy(新的字符串),所以s的结果不会进行改变。(如下图)
在这里插入图片描述
在这里插入图片描述
输出:“Hello World”(会进行字符串空格的删减)

immutable的好处:更安全

mutable的风险举例:
1、
在这里插入图片描述
:如图,在最后打印的时候两条打印的结果是一样的(10),因为List是一种mutable类型的。
该函数超出了spec范畴,因为它改变了输入参数的值。这种错误非常难于跟踪和发现,对其他程序员来说,也难以理解。

2、
假设我们写了⼀个判断春天的第⼀天的⽅法:
在这里插入图片描述
使⽤了有名的⼟拨⿏算法 (Harold Ramis, Bill Murray, et al. Groundhog Day, 1993).,使⽤者⽤这个⽅法来计划他们的派对开始时间:
在这里插入图片描述
但是过了一段时间,使用者重写了startOfSpring()使土拨鼠最多被问一次,然后缓存这次的答案,以后直接从缓存读取:
在这里插入图片描述
Data是一个mutable类型。所以partyData改变了值,则groundHogAnswer也会改变。
在这里插入图片描述
1和2中如果List和Data是immutable则不会出现这个问题。
如何避免?通过防御式拷贝,给客户端返回一个全新的Date对象。(下图)但是大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费
在这里插入图片描述
mutable不安全的原因:多个引用指向了一个变量。

immutable就是确保类中存储的属性的值不被改变。如何保证类中存储的属性的值不被改变?
1、类中不能有改变属性的值的方法。2、属性不能是public类型。3、不能把属性的引用暴露出去(返回值的时候不能直接把属性返回)
例:如下图,不满足3(红框部分),应该返回一个new的对象
在这里插入图片描述
另外还有一个问题(如下图):在执行完end.setYear(78)后,p中的end的属性也改变了。(上图蓝框部分)
在这里插入图片描述
修改后:
在这里插入图片描述

3.4Snapshot diagram

Snapshot diagram处于Code level, moment level和runtime level
基本数据类型
在这里插入图片描述
基本数据类型的名字不是存在栈里的(基本数据类型没有ID),所以如图都是值
对象数据类型
在这里插入图片描述
如图,对象的属性(虽然可能是基本数据类型)和对象一起放在里。对一个对象的引用是存在里(如下图的s)。
在这里插入图片描述
不可变对象:用双线椭圆(如上图)
双线代表不可改变。

final限定的是引用不可改变,对mutable和immutable的限定是不一样的。
不可改变的引用用双线箭头
在这里插入图片描述
如上图,id是final类型,限制的是一个mutable类型的变量,只能指向如图的区域,不能指向其他内存区域。但是区域里的值可以改变如改成999是可以的。引用是不可变的,但指向的值却可以是可变的
但是如果
final的id限制的是一个immutable类型的变量
那么引用和值都不能改变。
举例:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值