Kotlin入门之数据类型

作者: wxyass 分类: Android,Kotlin 发布时间: 2018-03-12 13:52

一 Boolean数据类型

val aBoolean: Boolean = true
val anotherBoolean: Boolean = false  

二 Number数据类型

具体如图

val anInt: Int = 8
val anotherInt: Int = 0xFF              // 255
val moreInt: Int = 0b00000011           // 3
val maxInt: Int = Int.MAX_VALUE         // 2147483647
val minInt: Int = Int.MIN_VALUE         // -2147483648

val aLong: Long = 12368172397127391
val another: Long = 123
val maxLong: Long = Long.MAX_VALUE      // 9223372036854775807
val minLong: Long = Long.MIN_VALUE      // -9223372036854775808

val aFloat: Float = 2.0F                // 2.0
val anotherFloat: Float = 1E3f          // 1000.0
val maxFloat: Float = Float.MAX_VALUE   // 3.4028235E38
val minFloat: Float = -Float.MAX_VALUE  // -3.4028235E38

val aDouble: Double = 3.0
val anotherDouble: Double = 3.1415926
val maxDouble: Double= Double.MAX_VALUE // 1.7976931348623157E308
val minDouble: Double= -Double.MAX_VALUE// -1.7976931348623157E308

val aShort: Short = 127
val maxShort: Short = Short.MAX_VALUE   // 32767
val minShort: Short = Short.MIN_VALUE   // -32768

val maxByte: Byte = Byte.MAX_VALUE      // 127
val minByte: Byte = Byte.MIN_VALUE      // -128

fun main(args: Array<String>) {
    println(anotherInt)                 // 255
    println(moreInt)                    // 3

    println(maxInt)                     // 2147483647
    println(Math.pow(2.0, 31.0) - 1)    // 2.147483647E9
    println(minInt)                     // -2147483648
    println( - Math.pow(2.0, 31.0))     // -2.147483648E9

    println(maxLong)                    // 9223372036854775807
    println(Math.pow(2.0, 63.0) - 1)    // 9.223372036854776E18
    println(minLong)                    // -9223372036854775808
    println(- Math.pow(2.0, 63.0))      // -9.223372036854776E18

    println(aFloat)                     // 2.0
    println(anotherFloat)               // 1000.0
    println(maxFloat)                   // 3.4028235E38
    println(minFloat)                   // -3.4028235E38

    println(0.0f/0.0f == Float.NaN)     // false

    println(maxDouble)                  // 1.7976931348623157E308
    println(minDouble)                  // -1.7976931348623157E308

    println(maxShort)                   // 32767
    println(minShort)                   // -32768

    println(maxByte)                    // 127
    println(minByte)                    // -128
}   

三 拆箱装箱

在Kotlin中不需要区分装箱和非装箱类型了

四 Char , 字符类型

字符对应Java的Character
占两个字节,表示一个16位的Unicode字符
字符用单引号”引起来,例如:’a’,’0′,’\n’

val aChar: Char = '0'
val bChar: Char = '中'
val cChar: Char = '\u000f'      // Unicode编码,表示一个空格

fun main(args: Array<String>) {
    println(aChar)              // 0
    println(bChar)              // 中
    println(cChar)
}  

打印一些特殊字符 用到转义字符

五 基础数据类型转换

不可隐式转换,必须api转换

val anInt: Int = 5
val aLong: Long = anInt.toLong()   

六 字符串

  • 一串Char
val string: String = "HelloWorld"
  • 字符串比较
    a==b 表示比较内容,即类似Java的equals
    a===b 表示比较对象是否相同

  • 字符串模板
    “Hello,$name” => “Hello,小明”

代码:

val string: String = "HelloWorld"
val fromChars: String = String(charArrayOf('H', 'e','l','l','o','W','o','r','l','d'))

fun main(args: Array<String>) {
    println(string == fromChars)                                // true 其中的==类似java中的equal
    println(string === fromChars)                               // false 其中的===类似java的==

    println("接下来我们要输出:" + string)                         // HelloWorld

    val arg1: Int = 0
    val arg2: Int = 1
    println("" + arg1 + " + " + arg2 + " = " + (arg1 + arg2))  // 0 + 1 = 1
    println("$arg1 + $arg2 = ${arg1 + arg2}")                  // 0 + 1 = 1  字符串模板

    //Hello "Trump"
    val sayHello : String = "Hello \"Trump\""                   // Hello "Trump"  打印双引号 用到转义字符
    println(sayHello)
    //salary
    val salary: Int = 1000
    //$salary
    println("\$salary")                                         // $salary  打印$ 用到转义字符

    val rawString: String = """
        \t
        \n
\\\\\\$$$ salary
    """
    println(rawString)                                          // 用三个双引号  打印的是里面的原始字符 注意$后要加空格
    println(rawString.length)
}  

七 类和对象

class 妹子(性格: String, 长相: String, 声音: String): 人(性格, 长相, 声音)
class 帅哥(性格: String, 长相: String, 声音: String): 人(性格, 长相, 声音)

open class 人(var 性格: String, var 长相: String, var 声音: String){
    init {
        println("new 了一个${this.javaClass.simpleName}, ta性格:$性格, 长相:$长相, 声音:$声音")
    }
}

fun main(args: Array<String>) {
    val 我喜欢的妹子: 妹子 = 妹子("温柔", "甜美", "动人")
    val 我膜拜的帅哥: 帅哥 = 帅哥("彪悍", "帅气", "浑厚")
    println(我喜欢的妹子 is 人)
}

// new 了一个妹子, ta性格:温柔, 长相:甜美, 声音:动人
// new 了一个帅哥, ta性格:彪悍, 长相:帅气, 声音:浑厚 
// true  

什么是类

  • 类,一个抽象的概念
  • 具有某些特征的实物的概括
  • 不特定指代任何一个具体的实物
  • 举例:人,车,书
  • 写法: class<类名>{<成员>}
  • 数,字符串也都是类

什么是对象

  • 是一个具体的概念,与类相对
  • 描述某一种类的具体个体
  • 举例: 某些人,领导的车,你手里的那本Java编程思想

类和对象的关系

  • 一个类通常可以有很多个具体的对象
  • 一个对象本质上只能从属于一个类
  • 某一个人,他是工程师,但本质上海市属于人这一类
  • 对象也经常被称作”类的对象”或者”类的实例”
    • 城市 – 北京,上海,深圳
    • 国家 – 中国,美国,加拿大
    • 歌曲 – 双节棍,飞得更高
    • 语言 – 汉语,日语,C语言

类的继承

  • 提取多个类的共性得到一个更抽象的类,即父类
  • 子类拥有父类的一切特征
  • 子类也可以自定义自己的特征
  • 所有类都最终继承自Any

八 空类型和智能类型转换?

1 在java代码中,需要对获取的字符串做非null判断,防止空指针异常

public class NullUnSafe {
    public static void main(String... args) {
        String name = getName();
        if(name == null){
            System.out.println("name is invalid!!");
        }else{
            System.out.println(name.length());
        }
    }

    public static String getName(){
        return null;
    }
}  

2 在kotlin中,任意类型都有可空和不可空两种

val notNull: String = null // 错误,不能为空
val nullable: String? = null // 正确,可以为空
notNull.length // 正确,不为空的值可以直接使用  
nullable.length // 错误,可能为空,不能直接获取长度  
nullable!!.length // 正确, 强制认定nullable不可空 
nullable?.length // 正确,若nullable为空,返回空   

3 智能类型转换

// Java Style 类型转换  // 类似Java的类型转换,失败则抛异常
val sun:SunClass = parent as SubClass

// 安全类型转化  // 如果转换失败,返回null,不抛异常
val sub:SubClass? = parent as? SubClass

// 智能类型转换 // 编译器尽可能的推到类型,远离无用的类型转换   
if(parent is SubClass) parent.<子类的成员>  
if(nullable != null) nullable.length  // 正确,因为我们确认nullable不为空  

九 包(package)

package net.println.kotlin.chapter2.市委书记.北京

import net.println.kotlin.chapter2.市委书记.上海.市委书记 as 茶水大王
import net.println.kotlin.chapter2.市委书记.天津.市委书记 as 围棋高手


fun main(args: Array<String>) {
    val 北京市市委书记: 市委书记 = 市委书记("张")
    val 上海市市委书记: 茶水大王 = 茶水大王("李")
    val 天津市市委书记: 围棋高手 = 围棋高手("王")
}  
  • 就是命名空间
  • 包的声明必须在非注释代码的第一行
  • 类的全名: net.println.kotlin.chapter2.HelloWorld

十 区间(Range)

val range: IntRange = 0..1024                   // [0, 1024]
val range_exclusive: IntRange = 0 until 1024    // [0, 1024) = [0, 1023] until非闭空间

val emptyRange: IntRange = 0..-1                //

fun main(args: Array<String>) {
    println(emptyRange.isEmpty())               // true
    println(range.contains(50))                 // true
    println(50 in range)                        // true

    for(i in range_exclusive){                  // 0, 1, 2, 3, ...... 11, 12, 1023,
        print("$i, ")
    }
}   
  • 一个数学上的概念,表示范围
  • ClosedRange的子类,IntRange最常用
  • 基本写法
    • 0..100 表示[0,100]
    • 0 until 100 表示[0,100)
    • i in 0..100 判断 i 是否在区间[0,100]中

十一 数组(Array)

一系列对象

val arrayOfInt: IntArray = intArrayOf(1,3,5,7)
val arrayOfChar: CharArray = charArrayOf('H', 'e','l','l','o','W','o','r','l','d')
val arrayOfString: Array<String> = arrayOf("我", "是", "码农")
val arrayOf书记: Array<市委书记> = arrayOf(市委书记("章"), 市委书记("赵"), 市委书记("黄"))

fun main(args: Array<String>) {
    println(arrayOfInt.size)                        // 4 
    for(int in arrayOfInt){
        println(int)
    }

    println(arrayOf书记[1])                           // 赵书记
    arrayOf书记[1] = 市委书记("方")
    println(arrayOf书记[1])                           // 方书记

    println(arrayOfChar.joinToString())               // H, e, l, l, o, W, o, r, l, d
    println(arrayOfChar.joinToString(""))   // HelloWorld
    println(arrayOfInt.slice(1..2))           // [3, 5]
}   
  • 基本写法
    val array: Array = arrayOf(…)
  • 基本操作
    print array[i] 输出第i个成员
    array[i] = “Hello” 给第i个成员赋值
    array.length 数组的长度
  • 为了避免不必要的装箱和拆箱,基本类型的数组是定制的

例子

val FINAL_HELLO_WORLD: String = "Hello World"
var helloWorld: String = FINAL_HELLO_WORLD
var nullableHelloWorld: String? = helloWorld
val helloWorldArray: Array<Char> = arrayOf('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
val helloWorldCharArray: CharArray = charArrayOf('H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd')
val helloWorldLength: Int = helloWorld.length
val helloWorldLengthLong: Long = helloWorldLength.toLong()

fun main(args: Array<String>) {
    // final hello world: Hello World
    println("final hello world: " + FINAL_HELLO_WORLD)
    // assignable hello world: Hello World
    println("assignable hello world: " + helloWorld)
    // hello world from nullable type: Hello World
    println("hello world from nullable type: " + nullableHelloWorld)
    // hello world from Array: HelloWorld
    println("hello world from Array: " + helloWorldArray.joinToString(""))
    // hello world from CharArray: HelloWorld
    println("hello world from CharArray: " + String(helloWorldCharArray))
    // class name hello world: HelloWorld
    println("class name hello world: " + HelloWorld::class.java.simpleName) //   

    // class name hello world: net.println.kotlin.chapter2.helloworld.HelloWorld  // 
    println("class name hello world: " + HelloWorld::class.java.name) //   

    // 报错:java.lang.StringIndexOutOfBoundsException: String index out of range: 11  
    println("part of the class name of HelloWorld: "
            + HelloWorld::class.java.simpleName.slice(0 until helloWorldLength)) // helloWorldLength=11 即:[0, 11)    

    // the length of hello world is : 11   
    println("the length of hello world is : " + helloWorldLength)    

    // the length of hello world is (long): 11   
    println("the length of hello world is (long): " + helloWorldLengthLong)
}  

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注