Kotlin基础(一)

227 阅读7分钟

简单总结体会,不足之处,望赐教

  • kotlin为什么是谷歌官方指定Android开发语言

    • Google Docs在跟Oracle打官司
    • Google 和开发商
    • 另外:Java不会被淘汰,但kotlin是未来
  • kotlin

    • 不会自动给变量赋值(声明一个变量就给他赋值)

       var name=""
      
  • 空检查(赋空值)

    • 采用广播机制,要求当变量在使用的时,采用补救措施

    • 代码示例

       fun main(args: Array<String>){
           var name: String ? = null;//“发送广播”,要求在后面的使用中进行补救措施
           //第一种补救措施:name如果为空,那么?后面的代码均不执行
           name?.length
           //第二种补救措施:无论name是否为空,代码都会执行
           name!!.length
           //第三种补求措施:先判断name是否为空,如果不为空,才执行后面的代码
           if(name != null){
               name.length
           }
       }
      
  • val var 类型推断

    • 读写问题

       fun main(args: Array<String>){
           //val 可读不可改
           val name="WAsbry"
           println("name:"$name)
           name="wasbry"//报错,不可改;因为在声明name的时候决定了它不可二次赋值
           
           //var 可读可改
           var name ="WAsbry"
           println("name:"$name)//可读
           name="wabry"//可改
       }
      
    • 使用场景

      • 尽量使用 val
    • 类型推断机制

      • 当变量声明时,不必显示指明父类(在IDEA中可以看到String是灰色的)

         fun main(args: Array<String>){
             //变量声明,显示指定父类
             val name: String = "WAsbry"
             val info: String = "Android开发"
             //变量声明,不显示指明其父类
             val name = "WAsbry"
             val info = "Android开发"
         }
        
      • 思考题:kotlin是静态语言还是动态语言

         fun main(args: Array<String>){
             var name = "WAsbry"
             name = 1000//报错
         }
        

        报错详解

        • 首先这是一个变量,是可读可写的
        • 但是因为kotlin内置的类型推断机制,第2行中,在编译器就已经决定了name是String类型的,所以第3行赋值失败
        • 在编译期就决定数据类型的即为编译期语言,编译期语言即为静态语言
        • 如果kotlin是动态语言的话就不会出现上面的那个问题;

        什么是动态语言?

        • 摘录自维基百科: 动态编程语言是高级编程语言的一个类别,在计算机科学领域已被广泛应用。它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。众所周知的ECMAScript便是一个动态语言,除此之外如PHP、Ruby、Python等也都属于动态语言,而C、C++、Java等语言则不属于动态语言。大部分动态语言都使用动态类型,但也有些不是。
  • kotlin函数

    • 方法与函数

      • Java:

        • Java中称作方法
        • Java中的方法必须依赖于类(即方法不能放到类的外面)
      • Kotlin

        • 称作函数
        • Kotlin中的函数并不依赖于类(函数写在类的外面,里面都是OK的)
    • 函数的返回值

       //这个函数的返回值为Unit,其实就是Java中的void
       fun main(args: Array<String>){
           
       }
       //可以改写成这个样子
       fun main: Unit(args: Array<String>){
           
       }
       //可以显示指定函数的返回值
       fun add(): Int{
           
       }
       ​
      
    • 函数的简写

       //原始函数
       fun add(number1,number2): Int{
           return number1+number2
       }
       ​
       //一行简写
       fun add(number1,number2): Int = number1+number2
      
    • 函数类型推导

       //在声明时不显示指定函数的返回值类型,依靠其内置的推导机制
       fun add2(number1: Int,number: Int) = number1+number2
       //推导为Double类型
       fun add3(number1: Int,number: Int) = number1+number2.toDouble()
       //返回值类型为String
       fun method01() = "WAsbry"
       //返回值类型为Char
       fun method02() = 'M'
       //返回值类型为Int
       fun method03() = 99
      
  • kotlin 重要性

    • Google一定会将kotlin推至首位

    • 各个语言的精华

      • 协程:Go
      • 操作符重载:C++
      • 虚拟机:Java
      • 增加任意一个类
    • 全栈发展方向(全家桶,一种语言做所有平台):服务器,Android,ios,web,native

  • Kotlin语言和JVM虚拟机

    • 由于其强大的编译器,性能很高

      image-20210919181254155

  • Kotlin语言的跨平台

    • Java:依靠虚拟机跨平台
    • Kotlin:依靠语言本身产生的字节码去跨平台
  • Kotlin学习技巧

    • 类比思想:重点关注那些 Java中没有的语言特性
  • 变量声明与内置数据类型

    fun main(){
    	println("Hello World")
        var name : String = "WAsbry"//可读可改
        name="wasbry"
        //内置数据类型:String,Char,Boolean,Int,Double,List(集合),Set(无重复集合),map(键值对的集合)
        Int--->java.int
        Float--->java.float 这个东西在编译的时候是会转成Java的
    }
    
  • Kotlin语言的只读变量(编译期会推荐将变量类型从var修改为val)

    //kotlin中的只读变量
    fun main(){
        //此时,将鼠标悬停在var上回提示,修改为val
        var info : String = "MyInFo"
        println(info)
    }
    
  • Kotlin 语言的类型推断

    fun main(){
        //此时,String会变成灰色的,意思就是可以省略
    	val info : String = "WAsbry"
        println(info)
        val age = 98
        println(age)
        var number = 10.34f//这个是float类型咩
    }
    
  • 编译时常量

    • 只能是基本的数据类型
    package com.wasbry
    
    const val PI=3.14//编译时常量只能定义在函数外,如果在函数内进行定义那么,只能在运行时才能调用函数进行赋值,就不是编译时了,定义在函数外,就可以在编译时进行赋值操作
    
    fun main(){
    	val PI=3.14//这个叫只读的变量,不叫常量
        const val PI=3.14//错误,修饰符const不适用于局部变量 
    }
    
  • 查看Kotlin反编译后的字节码

    • 查看操作:Tools/Kotlin/Show Kotlin Bytecode

    • 就是下面的这样代码:字节码中会搞出一个类,因为JVM是拿这个字节码的

      源程序

    fun main(){
        
    }
    

    image-20210919191956842

    image-20210919192123083

    • 字节码里面可以看到Char类型(会转成ASCII码),String可以,数字(整形)可以看到
    • 这个字节码是可以转换为 Java代码的,点那个Decompile, 数字是会被盖住的,在转成字节码的时候是这个样子:public static int number = true
  • Kotlin语言中的引用类型

    • 内置的数据类型都是类,那么就是引用类型,那么会不会耗费性能呢?

      • 查看字节码时,这些引用类型都会转成 Java中的基本数据类型
    • Java语言的数据类型

      • 基本数据类型:int,double 等
      • 引用数组类型:String,类,数组
    • Kotlin语言的数据类型

      • 看起来都是引用类型,但在实际应用中会将其转为 Java中的基本数据类型
    fun main(){
        
    }
    
  • Kotlin中的range表达式

    • 左闭右开,常用于指定区间
    fun main(){
    	val number=180
        if(number in 10..59){
    		println("不及格")
        }else if(number in 0..9){
            println("不及格,并且分数很差")
        }else if(number in 60..100){
            println("合格")
        }else if(number !in 0..100){
    		println("分数不在0100之间")
        }
    }
    
  • Kotlin 中的when表达式,这个是表达式不是语句;表达式是可以有返回值的

    • Java中的 if,switch都是语句
    • Kotlin中的 if,when 都是表达式,
    fun main(){
    	val week=5
        val info=when(week){
            1->"今天是星期一"
    		2->"今天是星期二"
            3->"今天是星期三"
            4->"今天是星期四"
            5->"今天是星期五"
            else->""//info一定为String类型
            else->{
                println("这样写返回值类型就是Any,类似于Java中的Object")
            }//其实还会有一句 kotlin.Unit,因为这个是个类啊,使用Unit代替了Kotlin 中的void关键字
        }
    }
    
  • Kotlin中的字符串模板(类似于Linux)

    fun main(){
        val garden = "黄石公园"
        val time = 6
        
        println("今天天气很晴朗,去${garden}玩了$个小时")//字符串模板
        
        val isLogin = true
        println("server response result: ${if(isLogin)恭喜你,登陆成功else登陆失败,请检查R esponse心虚")
    }
    
  • Kotlin 函数头

    • 示意图
    • kotlin中,函数默认符为:public static final

image.png

-   代码示例

    ```
     private fun method01(age: Int,name: String) : Int {
         println("你的名字是:$name,你的年龄是$age")
         return 2000
     }
    ```

-   转化为 Java代码

    ```
     private static final int method01(int age,String name){
         String var2 = "你的姓名是:"+name+",你的年龄是:"+age;
         boolean var3 = false;//这个应该是那个传入age
         System.out.println(var2);
         return 200;
     }
    ```
  • Kotlin 函数参数的默认参数

    • 为函数参数指定默认值
      • 在传实参的时候,有默认值的参数即可缺省
     fun main(){
         action01("wasbry",21)
         action02("WAsbry")
         action03()
     }
     
     private fun action01(name: String,age: Int){
         println("你的名字是$name,你的年龄是$age");
     }
     private fun action02(name: String,age: Int=21){
         println("你的名字是$name,你的年龄是$age");
     }
     private fun action03(name: String="WAsbry",age: Int=21){
         println("你的名字是$name,你的年龄是$age");
     }
     
    
  • kotlin语言具名函数参数

    • 在调用时对参数进行赋值(并不依赖于参数的原始顺序,指定参数名与参数值即可)
     fun main(){
         loginAction(username="WAsbry",age=21,userPhoneNumber="666")
     }
     
     private fun loginAction(username: String,userPhoneNumber: String,age: Int){
         println("Hello Kotlin")
     }
    
  • Kotlin 语言中Unit函数的特点

    • Unit是(不写的,默认也有,Unit代表 无参数返回的 忽略类型 == Unit 类型类)

    • 联系

      • Unit 相当于 Java中的 void
    • 区别

      • Java中的 void是一个关键字(无参数返回 的忽略类型,它是关键字,不是类型,这有点矛盾了),关键字是不能直接使用的
      • Kotlin中的 Unit是一个类
     fun main(){
         
     }
     //逐个简化了
     private fun doWork(): Unit{
         return println()
     }
     private fun doWork(){
         return println
     }
     private fun doWork(){
         println
     }
     ​
    
  • Kotlin语言中的 Nothing类型特点

    • 这是一个异常,会终止程序的
     fun main(){
         
     }
     
     private fun show(number: Int){
         when(number){
             -1 -> TODO("没有这种分数")
             in 0..59 -> println("分数不及格")
             in 60..70 -> println("分数及格")//70分是不是这个档次?跟range比较
             in 71..100 -> println("分数优秀")
         }
     }
    
  • Kotlin 中的反引号

    • 可以拿来包裹函数名,做本地测试

       fun main(){
           //包裹函数名,做本地测试
       }
       private fun `2021.8.8测试 登录功能`(name: String,age: Int){
           println("测试人员为$name,年龄为$age")
       }
      
    • 屏蔽kotlin 关键字(在与Java代码进行合并时尤为突出)

      • Java代码

         public class KtBase{
             public static final void in(){
                 println("这是Java类中的一个in方法")
             }
             public static final void is(){
                 println("这个Java类中的一个is方法")
             }
         }
        
      • Kotlin 代码

         fun main(){
             KtBase.`in`()
             KtBase.`is`()
         }
        
    • 防止反编译剽窃代码

       fun main(){
           
       }
       //这个函数是项目的核心功能,函数名使用数字进行替换,即使反编译后,拿到的也只是数字而已
       //通常会另外准备一份文档,用于说明函数的作用
       private fun `12138`(){
           
       }
      
  • 小结篇

    • 只要要搞Android,就要学Kotlin
    • Kotlin 有很多其他的特性(特性)
    • 生成二进制代码,直接开始干
    • 多跟 Java进行对比,需要不停对比
    • 内置数据类型(引用类型)--->最后都会转成 Java中的基本数据类型
    • 编译时常量:写在函数之外,在编译器就初始化
    • 查看字节码,同样遵循 JVM规范
    • range从10到59,双闭?
    • 默认函数参数:类比于C++
    • 具名参数:类比于linux
    • 返回值类型:Unit
    • Nothing:TODO用于终止异常
    • 反引号: ` 的三种应用场景