编辑: ok2015 | 2017-09-18 |
通常,编程 语言中的类型系统中定义了: ? 如何将数值和表达式归为不同的类型;
? 如何操作这些类型;
? 这些类型之间如何互相作用. 我们在编程语言中使用类型的目的是为了让编译器能够确定类型所关联的对象需要 分配多少空间. 类型系统在各种语言之间有非常大的差异,主要的差异表现在编译时期的语法及运行 时期的操作实现方式上.在每一种编程语言中,都有一个特定的类型系统.静态类型在编 译时期就能可靠地发现类型错误,因此通常能增进最终程序的可靠性.然而,有多少的类 型错误发生,以及有多少比例的错误能被静态类型所捕获,仍有争论. 本章简单介绍一下 Kotlin 的类型系统. 3.1 类型系统定型(typing,又称类型指派)的过程就是赋予一组比特以具体的意义.类型通常和 存储器中的数值或对象(如变量)相联系.因为在计算机中,任何数值都是由一组简单的 比特位组成的,硬件无法区分存储器地址、脚本、字符、整数及浮点数.类型可以告知程 序和程序设计者,应该怎么对待那些比特位. 3.1.1 类型系统的作用 使用类型系统,编译器可以检查无意义的、无效的、类型不匹配等错误代码.这也正 是强类型语言能够提供更多的代码安全性保障的原因之一. 另外,静态类型检查还可以提供有用的信息给编译器.与动态类型语言相比,由于有 了类型的显式声明,静态类型的语言更加易读好懂. 有了类型,我们还可以更好地做抽象化、模块化的工作.这使得我们可以在较高抽象 层次思考并解决问题.例如,Java 中的字符数组 char[]s={'
a'
,'
b'
,'
c'
} 和字符串类型 String str= abc 就是最简单、最典型的抽象封装实例.下面分别举例说明. 字符数组代码示例如下: Kotlin 从入门到进阶实战 ・42・ jshell>
char[] s = {'
a'
,'
b'
,'
c'
} //字符数组 s ==>
char[3] { '
a'
, '
b'
, '
c'
} jshell>
s[0] //访问第一个元素,注意下标是
0 $3 ==>
'
a'
jshell>
s[1] $4 ==>
'
b'
jshell>
s[2] $5 ==>
'
c'
字符串代码示例如下: jshell>
String str = abc //声明字符串 str ==>
abc jshell>
str.toCharArray();
//String 类型转换成字符数组 $7 ==>
char[3] { '
a'
, '
b'
, '
c'
} 3.1.2 Java 类型系统 Java 类型系统可以简单用下面的图 3-1 来表示. 图3-1 Java 类型系统 关于 Java 中的 null,有很多比较 坑 的地方.例如: int i = null;
//type mismatch : cannot convert from null to int short s = null;
//type mismatch : cannot convert from null to short byte b = null: //type mismatch : cannot convert from null to byte double d = null;
//type mismatch : cannot convert from null to double Integer io = null;
//编译 int j = io;
//编译 ok,但运行时报 NullPointerException 基本数据类型与引用数据类型在创建时,内存存储方式区别如下: 第3章类型系统与可空类型 ・43・ ? 基本数据类型在被创建时, 在栈上给其划分一块内存, 将数值直接存储在栈上 (性 能高);
? 引用数据类型在被创建时,首先在栈上给其引用(句柄)分配一块内存,而对象 的具体信息存储在堆内存上,然后由栈上面的引用指向堆中对象的地址. 3.1.3 Kotlin 的类型系统 Java 是一个近乎 纯洁 的面向对象编程语言,但是为了编程方便还是引入了基本数 据类型.为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入 了对应的包装类型(wrapper class),int 的包装类型就是 Integer,从Java