软件构造(四)
一、编程语言中的数据类型
1.1基本数据类型:int long boolean double char short byte float
都是不可变数据类型、只有值没有ID(无法与其他值区分) 在栈中分配内存
1.2对象数据类型:Classes interfaces arrays
有时是可变有时不可变、既有ID也有值、 在堆中分配内存
1.3对象类型形成层次结构
extends(继承关系)
1.4将基本数据类型包装成对象类型
Integer、Boolean…(仍是不可变的,一般可以进行自动转换)
二、静态类型和动态类型
静态类型语言(Java)在编译时进行类型检查,动态类型语言(Python)在运行时进行类型检查
三、类型检查
3.1例子:
int a = 2; a = 2(正常赋值)
double a = 2; a = 2.0 (Implicit)(int在赋值时被转换为double )
int a = 18.7; ERROR(类型不匹配)
String a = 1; ERROR(类型不匹配)
int a = (int) 18.7; a = 18(进行强制类型转换是舍去小数)
double a = 2/3; a = 0.0(2与3是int导致他们相除为0)
double a = (double)2/3; a = 0.6666…(2强制转换为double)
3.2检查内容:
Syntax errors 语法错误
Wrong names 类名/函数名错误
Wrong number of arguments 参数数目错误
Wrong argument types 参数类型错误
Wrong return types 返回值类型错误
Illegal argument values 非法的参数值
Unrepresentable return values 非法的返回值
Out-of-range indexes 越界
Calling a method on a null object reference 空指针
3.3分类
静态检查:关于“类型”的检查,不考虑值
动态检查:关于“值”的检查
四、可变数据类型和不可变数据类型
改变一个变量:将该变量指向另一个值的存储空间。
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
1 final:
final类无法派生子类
final变量无法改变值/引用
final方法无法被子类重写
2
不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用
例如,String是不可变对象。改变了String的值后,JVM会申请新的内存,并将这个变量指向这个区域
安全的使用可变类型:局部变量,不会涉及共享;只有一个引用,如果有多个引用(别名),使用可变类型就非常不安全
五、Snapshot diagram as a code-level, run-time, and moment view
Moment Period
Build-time design,build,refactoring Version Control
Run-time Code snapshot,heap dump Thread and Process
5.1 Snapshot diagrams
用于描述程序运行时的内部状态、便于程序员之间的交流、便于刻画各类变量随时间变化、便于解释设计思路
5.2 变量类型的图示
单箭头:表示一个基本数据类型的值
单线圆圈:表示一个对象(可以细化对象内部的变量)
双线椭圆:表示不可变的对象
不可变的引用:用双线箭头
引用是不可变的,但指向的值却可以是可变的(final StringBuilder s)
可变的引用,也可指向不可变的值(String s)
六、复杂数据类型
Arrays and Collections
List Set Map
可以使用迭代器进行迭代,使用remove时要注意
七、有用的不可变数据类型
可利用Collections.unmodifiableList将一个可变的List、Set、Map包装成不可变的类型
List.of() Set.of() Map.of()也可进行不可变的包装。
八、空引用
空引用只能应用在对象上,基本数据类型上使用会报错。
心得感想:数据类型的可变不可变更多的是取决于程序员的需要以及信息安全方面的考虑,是一种很好的防范外部对内部数据安全进行破坏的方式,同时也一定意义上时时刻刻约束着程序员,规范编程时的行为。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现