学习内容概述:
- 学习静态类型
- 了解好的软件应该具有的三个属性
类型
类型是一些值的集合,以及这些值对应的操作
java中数据类型分为两种:基本数据类型和引用数据类型
1. 基本数据类型:
类型名称 | 关键字 | 占用内存 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128~127 |
短整型 | short | 2 字节 | -32768~32767 |
整型 | int | 4 字节 | -2147483648~2147483647 |
长整型 | long | 8 字节 | -9223372036854775808L~9223372036854775807L |
单精度浮点型 | float | 4 字节 | +/-3.4E+38F(6~7 个有效位) |
双精度浮点型 | double | 8 字节 | +/-1.8E+308 (15 个有效位) |
字符型 | char | 2 字节 | ISO 单一字符集 |
布尔型 | boolean | 1 字节 | true 或 false |
同C语言不同的是,java中所有的基本数据类型的大小(所占用字节数)都已经明确规定,在各种不同的平台上都保持不变
2. 引用数据类型:
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。由用户自定义,用于限制其他数据的类型,不支持指针类型,结构类型,联合类型以及枚举类型。
常用的对象类型例如:
String
:表示一串连续的字符
BigInteger
:表示任意大小的整数
一般而言使用大写作为对象类型的起始字母
操作符:
操作符是一些能接受输入并输出结果的功能
常见有以下三种:
- 前缀、中缀、后缀操作符. 例如,
a + b
调用这样一种操作(映射)+ : int × int → int
(+
是这个操作符的名字,int × int
描述了这两个输入, 最后的int
描述的了输出) - 一个对象的方法. 例如,
bigint1.add(bigint2)
调用这样一种操作(映射)add: BigInteger × BigInteger → BigInteger
. - 一个函数. 例如:
Math.sin(theta)
调用这样一种操作(映射)sin: double → double
. 注意,Math
不是一个对象,它是一个包含sin
函数的类。
可重载:
有一些操作符可以对不同类型的对象进行操作,就称为可重载(overloaded),例如算术运算符
+
,-
,*
,/
,一些函数也可重载,例如String
类中的indexOf()
静态类型
Java是一种静态类型的语言。
这里的静态是指所有变量的类型在编译的时候就已经确定,所以编译器也可以推测出每一个表达式的类型。例如,如果a
和b
是int
类型的,那么编译器可以推得a+b
的结果也是int
类型的。
在动态类型语言中(例如Python),这种类型检查在程序运行的时候进行。
以Eclipse和pycharm分别编写java和python程序,
Eclipse在你写代码的时候就在做这些检查,所以你就能够在编辑的同时发现这些问题,而pycharm只有当运行python文件后才会发现这些问题。
静态检查检查发生在编译的时候
静态类型就是静态检查中一种方法,可以有效阻止大部分将操作符作用到不对应的类型对象上
关于强弱类型和静动态类型的区别将在其他文章中说明
静态检查、动态检查、无检查
编程语言通常能提供以下三种自动检查的方法:
- 静态检查: bug在程序运行前发现
- 动态检查: bug在程序运行中发现
- 无检查: 编程语言本身不帮助你发现错误,你必须通过特定的条件(例如输出的结果)检查代码的正确性。
很明显,静态检查优于动态检查优于不检查。
静态检查
- 语法错误,例如多余的标点符号或者错误的关键词。即使在动态类型的语言例如Python中也会做这种检查:如果你有一个多余的缩进,在运行之前就能发现它。
- 错误的名字,例如
Math.sine(2)
. (应该是sin
.) - 参数的个数不对,例如
Math.sin(30, 20)
. - 参数的类型不对
Math.sin("30")
. - 错误的返回类型,例如一个声明返回int类型函数
return "30";
动态检查
- 非法的变量值。例如整型变量x、y,表达式
x/y
只有在运行后y为0才会报错,否则就是正确的。 - 无法表示的返回值。例如最后得到的返回值无法用声明的类型来表示。
- 越界访问。例如在一个字符串中使用一个负数索引。
- 使用一个
null
对象解引用。(null
相当于Python中的None
)
对比
静态检查倾向于类型错误,即与特定的值无关的错误。一个类型是一系列值的集合,而静态类型就是保证变量的值在这个集合中,但是在运行前我们可能不会知道这个值的结果到底是多少。所以如果一个错误必须要特定的值来“触发”(例如除零错误和越界访问),编译器是不会在编译的时候报错的。
动态类型检查倾向于特定值才会触发的错误。
Comments NOTHING