学习内容概述:

  • 学习静态类型
  • 了解好的软件应该具有的三个属性

    类型

    类型是一些值的集合,以及这些值对应的操作

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是一种静态类型的语言。
这里的静态是指所有变量的类型在编译的时候就已经确定,所以编译器也可以推测出每一个表达式的类型。例如,如果abint类型的,那么编译器可以推得a+b的结果也是int类型的。
在动态类型语言中(例如Python),这种类型检查在程序运行的时候进行。
以Eclipse和pycharm分别编写java和python程序,
Eclipse
Pycharm
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

对比

静态检查倾向于类型错误,即与特定的值无关的错误。一个类型是一系列值的集合,而静态类型就是保证变量的值在这个集合中,但是在运行前我们可能不会知道这个值的结果到底是多少。所以如果一个错误必须要特定的值来“触发”(例如除零错误和越界访问),编译器是不会在编译的时候报错的。
动态类型检查倾向于特定值才会触发的错误。


随心所至