一、Kotlin数据类型分类
Kotlin的数据类型分为以下几种:
- 基本数据类型:数值类型、字符类型、字符串类型,字节类型、布尔类型和数组类型。
- 其他类型:集合、映射、类、接口。
Kotlin所有数据类型都是引用类型,所以可以在数据上直接访问属性和调用方法。
二、Kotlin数值类型
Kotlin的数值类型和大部分语言一样,分为整型和浮点型。其中,整型分为:整型Int、长整型Long、短整型Short;浮点型分为:单精度Float、双精度Double。
注意:
- 在Kotlin中,Long类型只能用L作为后缀,Float类型可以使用f/F后缀,Double类型可以使用d/D后缀。
- 浮点型数据一般只用作展示,不建议使用浮点型的数据直接进行计算,应使用“BigDecimal”类型代替浮点类型计算。
这里使用一个实例帮助大家加深一下理解:
/** * 加、减、乘、除 高精度计算工具类 */ object BigDecimalUtils { const val DECIMAL_POINT_NUMBER:Int = 2; // 精确到小数点后2位 // 加法运算 fun add(d1 : Double, d2: Double) = BigDecimal(d1).add(BigDecimal(d2)).setScale(DECIMAL_POINT_NUMBER, BigDecimal.ROUND_DOWN).toDouble() // 减法运算 fun sub(d1:Double,d2: Double):Double = BigDecimal(d1).subtract(BigDecimal(d2)).setScale(DECIMAL_POINT_NUMBER,BigDecimal.ROUND_DOWN).toDouble() // 乘法运算 fun mul(d1:Double,d2: Double,decimalPoint:Int):Double = BigDecimal(d1).multiply(BigDecimal(d2)).setScale(decimalPoint,BigDecimal.ROUND_DOWN).toDouble() // 除法运算 fun div(d1:Double,d2: Double):Double = BigDecimal(d1).divide(BigDecimal(d2)).setScale(DECIMAL_POINT_NUMBER,BigDecimal.ROUND_DOWN).toDouble() }
这里的setScale方法用于格式化小数点,后面参数为舍入模式。
三、Kotlin字符&字符串类型
字符类型:Char。字符串类型:String。
这里Kotlin提供了字符串模版,允许我们在字符串中嵌入表达式。在使用的时候需要将表达式用‘${}’包裹。
四、Kotlin字节类型和布尔类型
字节类型:Byte,一般用于表示一个二进制数据。
布尔类型:Boolean,只有两个值:true 和 false。(注意:在Kotlin中,布尔类型不能用0或1表示)。
五、Kotlin 内置类型结构
1. Any 类型 - 所有类的父类
Any类型是所有类的父类。即:数值类型是Any类型,字符串类型也是Any类型,开发者在Kotlin中定义的任何类型的类都是Any类型。
下面是Any类型在Kotlin源码中的定义:
public open class Any { public open operator fun equals(other: Any?): Boolean public open fun hashCode(): Int public open fun toString(): String }
2. Unit 类型 - 什么都不返回
在Kotlin中,Unit类型表示什么都不返回,类似于Java中的void类型。
下面是Kotlin源码中对Unit的定义:
public object Unit { override fun toString() = "kotlin.Unit" }
3. Nothing 类型 - 什么都没有
在Kotlin中,Nothing类型表示什么都不返回。当一个方法返回Nothing类型时,意味着:它永远不会返回内容,只会抛出异常。
/** * Nothing has no instances. You can use Nothing to represent "a value that never exists": for example, * if a function has the return type of Nothing, it means that it never returns (always throws an exception). */ public class Nothing private constructor()
六、类型判断和类型转换
1. 强制类型转换
强制类型转换的语法为 as,需要明确指定需要转换的目标类型。使用示例如下:
val fooString: String = foo as String
注意,如果无法成功转换类型的时候,程序会抛出"Type misamtch"异常。
2. 安全类型转换
如果需要进行安全类型转换,需要在 as 后面加 ? ,这样当转换失败的时候,会返回空值。注意:安全类型转换的值,只能赋给可空类型的变量。
// 使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常。 var str = null var str2 = str as? String println(str2) //输出结果为:null
3. 类型判断与智能转换
在Kotlin中,我们可以使用“is”操作符来判断一个对象是否是指定的数据类型。
示例:
fun bar(foo: Any) { if(foo is String) println(foo) }
在上面的例子中,如果参数foo是String类型,则调用bar的时候,会在控制台打印该字符串。
在Kotlin中,如果编译器能从上下文推断出对象的真实类型,则在该上下文对象会自动转换为真实类型,这个特性被称为智能转换。