kotlin变量和表达式

2022-10-26  本文已影响0人  Bfmall

一、变量、常量、引用类型

/**
 * 定义编译时常量
 * 编译时常量只能是基本的类型(String, Int, Double, Float, Short,Boolean, Long, Byte, Char)
 * 编译时常量只能在函数之外定义,为什么?如果在函数之内定义,必须在函数运行时才能给常量赋值,何来编译时常量一说
 * 结论:只能在函数之外定义,就可以在编译阶段初始化了
 */
const val PI = 3.1415

class KtBaseTest01 {

    companion object {
        const val TAG = "KtBaseTest01"
    }

    fun test01() {
        /**
         * 可读可改   变量名  变量类型     值
         * var       name : String = "lanny"
         */
        var name : String = "lanny"
        name = "levone"//var变量可以改变值
        println(name)
        Log.d(TAG, "test01==>name="+name)

        /**
         * 不可改变的(只读变量)    变量名     变量类型   值
         * val                    age   :    Int =    26
         */
        val age : Int = 26
//        age = 30//提示报错,变量不能被修改
        print(age)
        Log.d(TAG, "test01==>age="+age)

        /**
         * 类型自动推断
         */
        val info : String = "hello world"
        val info1  = "hello world"// 自动推断为String类型,类型可省略
        val info2  = 99//Int类型

    }


    fun test02() {
        Log.d(TAG, "test02==>PI="+PI)

        /**
         * 编译时常量不可修改值
         */
//        PI = 45
        /**
         * 编译时常量只能在函数之外定义
         * 修饰符const不适用于局部变量
         */
//        const val PI2 = 3.1415
    }

    /**
     * 学习查看kotlin反编译后字节码
     * Android Studio->Tools->Kotlin->Show Kotlin Bytecode
     *
     * L0
     * LINENUMBER 71 L0
     * BIPUSH 99
     * ISTORE 1
     * L1
     * LINENUMBER 72 L1
     * LDC "\u4f60\u597d\u5417"
     * ASTORE 2
     * L2
     * LINENUMBER 73 L2
     * ICONST_0
     * ISTORE 3
     * L3
     */
    fun test03() {
        val number1 = 99
        var number2 = "你好吗"
        var isShowLog = false
    }

    /**
     * kotlin 引用类型
     *
     * java中有两种数据类型:
     * 1.基本类型int, boolean...等
     * 2.引用类型String
     *
     * kotlin语言只有一种数据类型:
     * 看起来都是引用类型,实际上编译器会在java字节码中,修改成“基本类型”
     */
    fun test04() {
        val num1 : Int = 11
        var str1 : String = "好得很"
        var isLoad : Boolean = true
    }
}

二、range/when表达式、字符串模板

const val TAG = "KtBaseTest02"
class KtBaseTest02 {
    /**
     * range表达式 范围 从哪里..到哪里
     *
     * number in 1..59
     */
    fun test01() {
        val number  = 100

        if(number in 1..59) {
            Log.d(TAG, "test01==>不及格")
        } else if (number in 60..79) {
            Log.d(TAG, "test01==>及格")
        } else if (number in 80..100) {
            Log.d(TAG, "test01==>牛逼")
        } else {
            Log.d(TAG, "test01==>分数不在范围内")
        }
    }


    /**
     * when表达式
     * java中when是语句
     * kotlin中when是表达式,有返回值的
     * if和when同理
     */
    fun test02() {
        var day = 0
        val result = when(day) {
            1 -> "星期一"
            2 -> "星期二"
//            else -> "日期不对"
            else -> {
                "日期不对"
            }
        }
        println(result)//void 关键字无返回,用Unit代替了java的void关键字
        Log.d(TAG, "test02==>result="+result)
    }

    /**
     * kotlin 字符串模板
     */
    fun test03() {
        val addr = "故宫"
        val hour = 3
        Log.d(TAG, "我去$addr 玩了, 玩了$hour 小时")//java写法
        Log.d(TAG, "我去${addr} 玩了, 玩了${hour}小时")//kt 字符串模板写法

        //java中if是语句,有局限性
        //,kt中if是表达式,有返回值,所以更灵活
        val isLogin = false
        Log.d(TAG, "登陆结果:  ${if (isLogin) "login success" else "login failure"} ")
    }
}
上一篇 下一篇

猜你喜欢

热点阅读