HIT软件构造-第四节-数据类型与类型检查01

一.简述一下这门课的感觉

其实我自诩有一点java基础,一直在B站和csdn等网站简单学习一些关于java的基础,所以刚上课的时候觉得这门课肯定没问题,但是当我听上一周以后,我发现自己之前学的还是太零碎的,但是值得肯定的是,有一些基础总比没有强,但是对课堂知识的细致理解,可以帮助我对之前学习的东西进行一个更为系统的提高,因此就算是之前有一些java基础的同学,对软构的认真对待也是必须的。下面我只会记录一些我认为在课堂上对我之前学习有所补充,相对重要的东西。

二.java的数据类型

数据类型:一组值以及可以对其执行的操作。

变量:用特定的数据类型定义,可存储满足类型约束的值

这里学过c语言的同学都比较熟悉了。

2.基本数据类型/对象数据类型

在这里我觉得老师给的一张图非常全面的解释了两种不同数据类型各自特点以及比较。

其实这里已经给出了为什么基本数据类型是不可变的,而有的对象数据类型是可变的。主要依赖于id与值,在这里简单说就是可变就是同一个id的值可以变,不可变就是同一个id的值不能变,想要改变只能改变id的指向。

三:静态/动态类型检查

1.静态检查

静态检查就是编译阶段去发现代码的错误,一般都是能直接发现的,比如语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误。这些错误都不需要进入程序去跑就能发现,在编译阶段检查出来避免带入运行阶段。

2.动态错误

这类错误一般是在代码运行时才会显现出来,最常见的就是空指针,越界,除数为0等,这些错误不是表面的,往往可能需要运行时才能发现。

3.总结

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

动态检查:关于值的检查

四.数据类型可变性与不可变性

这里引用一位博主「终不似春风」的文章内容: 

原文链接:https://blog.csdn.net/qq_17184049/article/details/94174481

1.不可变数据类型

当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。其中基本数据类型都是不可变数据类型,例如int,如果一个int类型的数据发生改变,那么它指向了内存中的另一个地址,但是需要注意的是java缓存了所有-128-127的值。


2.可变数据类型 

当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型,当可变数据类型改变时它实际上是更改了内存中的内容。

在课堂上我觉得老师可能认为我们基础相对薄弱,没有深入讲解可变与不可变区别,从这位博主这里我们可以知道,所谓可变就是同一地址的内容发生变化,而不可变就是一个地址里的内容不可变化,这里不懂的同学会有一个问题,明明一个int类型的变量我可以赋值1也可以赋值2,怎么就不可变了。其实不可变我们是针对的数据类型,而变量只是一个指向,上面的解释足已解决这个问题。如果要求指向也不变化的就要使用final修饰,在这里引入final。

3.final

final类无法派生子类

fianl变量无法改变值/引用

final方法无法被子类重写

final修饰词的出现就可以使一个int类型的变量指向的值本身无法改变的同时,变量的指向也无法改变,仿佛int类型的变量和该值捆绑在一起了。

4.Spring/SpringBuffer/SpringBulider

在窝工课堂上老师使用的时Spring和SpringBuffer分别对应不可变数据类型和可变数据类型进行讲解,这里加上SpringBuilder主要是向让大家Spring的理解更加立体。

4.1Spring/SpringBuffer/SpringBulider的区别以及使用条件

Spring:不可变字符系列,效率低,但是复用性高。

说白了就是一个地址的值不变了,大家都可以用这个地址的值,但是面对新的值就需要有新的地址。

StringBuffer:可变字符序列,效率较高(增删),线程安全。

说白了就是我一个StringBuffer对象对应的那个地址,我里面的值我随便修改,不会占用新的地址,同时我是线程安全的,多线程的操作我不怕,不会出问题。

StringBuilder:可变字符序列,效率最高,线程不安全。

其实StringBuilder与StringBuffer的功能非常相似,只差在线程是否安全上,这里StringBuilder不支持多线程,因此在单线程下,其性能最好。

如何选择:

如果字符串有大量的修改操作,而且单线程,使用SpringBuilder

如果字符串有大量的修改操作,而且多线程,使用SpringBuffer

如果字符串修改很少,使用String

5.可变类型的安全性

在课堂上老师给出了两个例子,分别是可变类型在方法体内被修改,以及返回一个可变类型会修改其原来的值的两个例子,我认为这两个例子完全是可以避免的,对于可变类型在方法体内可能没修改的问题,在方法的规约中应该明确给出,程序员也应该默认不修改传入的可变类型。而对于返回可变类型的问题,老师也给出了防御式的方法,即返回一个以可变类型为基础创建的一个新的对象,这样可以避免修改原对象,当然不可变类型是更加安全的,但是不能因为可变类型的潜在的不安全就完全不考虑,而是应该在安全与性能中进行选择,同时要遵循严格的编写程序规范,才能最大化的利用不同字符串的类型。

五:Snapshot diagram

1.为什么使用Snapshot diagram

用于描述程序运行时的内部状态

便于程序员交流

便于刻画各类变量随时间的变化

便于解释设计思路

2.基本类型的值与对象类型的值

基本类型:直接箭头表示

对象类型:椭圆表示

变量:变量名字直接指向

不可变类型:双线箭头指向

不可变对象(final):双线椭圆

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值