简单总结体会,不足之处,望赐教
-
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虚拟机
-
由于其强大的编译器,性能很高
-
-
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(){ }- 字节码里面可以看到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("分数不在0到100之间") } } -
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
- 代码示例
```
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用于终止异常
- 反引号: ` 的三种应用场景