Kotlin学习笔记(三):Kotlin 数据类型及使用方式梳理


一、Kotlin数据类型分类

Kotlin的数据类型分为以下几种:

  • 基本数据类型:数值类型、字符类型、字符串类型,字节类型、布尔类型和数组类型。
  • 其他类型:集合、映射、类、接口。

Kotlin所有数据类型都是引用类型,所以可以在数据上直接访问属性和调用方法。

二、Kotlin数值类型

Kotlin的数值类型和大部分语言一样,分为整型和浮点型。其中,整型分为:整型Int、长整型Long、短整型Short;浮点型分为:单精度Float、双精度Double。

注意:

  1. 在Kotlin中,Long类型只能用L作为后缀,Float类型可以使用f/F后缀,Double类型可以使用d/D后缀。
  2. 浮点型数据一般只用作展示,不建议使用浮点型的数据直接进行计算,应使用“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中,如果编译器能从上下文推断出对象的真实类型,则在该上下文对象会自动转换为真实类型,这个特性被称为智能转换。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM