Kotlin语言学习笔记一

一、学习Kotlin好处

1.1、为什么要学习kotlin?

  • java语言比较稳健,久经考验,有庞大的生产代码库。然而,java裹足不前,开发者喜欢的很多现代语言高级特性,它都没有,或者迟迟加入。

  • kotlin从这些经验中受益良多,而java中的某些早期设计却越来越陈旧。脱胎于旧语言,kotlin解决了很多痛点,进化成一门优秀的语言。相比java,kotlin进步巨大,带来了更可靠的开发体验。

  • 最重要的一点,google推崇kotlin,将kotlin定性为android主要开发语言,很多优秀的开源源码库均是由kotlin编写并维护。

1.2、kotlin的跨平台特性

  • kotlin不仅支持编写代码在虚拟机上运行,而且是一门跨平台的通用型语言,我们可以用kotlin开发各种类型的原生应用,如Android,macOS,Windows,Javascript应用。

  • kotlin能脱离虚拟机层,直接编译成可以在Windows,LInux和macOS平台上运行的原生二进制代码。

二、Kotlin语言声明变量与内置数据类型

 
  
fun main(){ printlin("Hello World") 
//如何声明一个变量 
var name : String = "xiebin" 
//和java语言对比 //private String name = "xiebin" println(name) 
// 对比: Java 把数据类型写在了变量前面,而kotlin 把数据类型写在了变量后面。 
}

var name : String = ""

可改可读 变量名 变量类型 变量赋值

2.1、数据类型

Java的两大基本数据类型

1、内置数据类型:

  八大基本数据类型:六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

   byte short int long float double boolean char

2、引用数据类型:

  • 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。

  • 对象、数组都是引用数据类型。

  • 所有引用类型的默认值都是null。

  • 一个引用变量可以用来引用任何与之兼容的类型。

  • 例子:Site site = new Site("Runoob")。

  • String 属于引用数据类型,并不属于基本数据类型

kotlin的数据类型

Kotlin语言学习笔记一_第1张图片

 

kotlin的数据类型都属于引用数据类型

思考:既然kotlin都用的是引用数据类型,那么会不会对性能有影响

答:不会,因为编译器在编译kotlin的时候,会把代码转变成字节码的形式,在转换后,kotlin的引用数据类型都会转换成Java的基本数据类型。

2.2、kotlin语言只读变量val

var 标识变量可读可改

val 标识常量量只可读不可改

const (编译时常量)只能用来修饰val, 并且Const 修饰的val只能定义在top level或者在objects中。top level指的是在最外面的类的外面,表示该常量属于整个文件,而非某个类。object可以指最外面的object和companion object。

编译的字节码:

Var 定义的变量是private的,并且会生成public的get和set方法。

Val 定义的常量是private的,并且会生成public的get方法。

Const val 定义的常量生成的字节码是由 public final static 来修饰。

2.3、kotlin 语言类型推断

 
  
fun main(){ 
var name:String = "xiebin" 
//也可以写成 var name = "xiebin" var age = 18 
//这样也能运行,说明kotlin语言在进行编译的时候,有类型推断功能。能够自行推断出数据类型 
//字符串模板 
println("我的名字是$name 年龄$age") 
}

三、kotlin语言函数表达式

3.1、kotlin的range表达式

 
  
fun main(){ 
    val number = 10
 
    if(number in 0..10){ 
        println("数字在0-10之间") 
    }else if(number in 11..50){
         println("数字在11-50之间") 
    } 
}

Range

正向:start..end 从哪里 到 哪里

反向:end downTo start

 
  
fun main(){ 
    for(i in 0..10){ 
    println(i) 
} 
//输出 0 1 2 3 4 5 6 7 8 9 10 

for(y in 10 downTo 0){
 println(y) 
} 
//输出 10 9 8 7 6 5 4 3 2 1 0 }

3.2、kotlin的when表达式

when表达式相当于Java中的switch语句,但是when表达式更加强大

 
  
fun main(){
    val number = 4
   val star =  when(number){
        1-> println("这个数字是1")
        2-> println("这个数字是2")
        3-> println("这个数字是3")
        4-> println("这个数字是4")
        else -> print("没有这个数字")
    }

    var str = when(number){
        1->"aaaa"
        2->"bbbb"
        3->"cccc"
        4->"dddd"
        else->"nonono"
    }
    println(str)
    println(star)

}

上面代码块和Java中的switch一个意思,但是when表达式还有返回值

 
  
fun main(){
   val number = 2
   val str = when(number){
               1->"这个数字是1"
               2->"这个数字是2"
               3->"这个数字是3"
               4->"这个数字是4"
               else ->"没有这个数字"
           }
        println(str)
   //输出这个数字是2,说明when表达式返回了字符串”这个数字是2“
   //这里也存在类型推断,我们写的是String,返回值推断出来的就是String
}

那么,如果我们返回值是不是一个数据类型,那么会出现说明情况呢

fun main(){
    val number = 4
    val str = when(number){
        1-> println("这个数字是1")
        2-> println("这个数字是2")
        3-> println("这个数字是3")
        4-> println("这个数字是4")
        else -> print("没有这个数字")
    }
    println(str)
    //输出kotlin.Unit   unit 相当于java的void
}

3.3、函数

fun main(){
    loginMethod("xiebin","123")
    //kotlin中的具名函数参数
     loginMethod(userName = "xiebin",password = "123")
}

fun loginMethod(userName:String , password:String){
  println("我的名字是$userName 我的密码是$password")
}

//写一个比较完整的方法

private fun login(name: String, password: String): String {
    
    return name+password
}
//和Java不同的是,在写方法的参数的时候,Java的类型在左边,但是kotlin的类型在右边
//返回值,java的返回值在方法名前面,kotlin在参数后面


//kotlin 在方法中  是可以配置默认参数的
private fun login2(name: String ="xiebin2", password: String="密码"): String {
    
    return name+password
}

3.4、匿名函数(重点)

匿名函数:顾名思义 就是没有名字的函数

fun main(){
//匿名函数,先看效果
 val name = "Brad"
 //Returns the length of this char sequence.  方法返回此字符串的字符长度
 val count = name.count()
 println(count)
 //输出4l

//根据源码可以看出,此方法还是返回 int ,但是后面有个大括号。这个就是匿名函数,大括号内部,是把字符串遍历成char,内部返回值是boolean
 val name2 = name.count {
     println(it)
     it  == 'r'
 }
 
}

3.5、隐式返回函数

fun main(){
//函数参数
val  login2:(Int,Int,Int) -> Boolean = {number1,number2,number3->
   true
}

}

//正常函数
fun login():Boolen{
  return true
}


//隐式返回函数
//输入 输出声明,
val login:() ->Boolen  = {
   true //隐式返回  最后一行为隐式返回
}

3.6、匿名函数类型推断

fun main(){
//匿名函数
//1  方法名:参数->返回值类型 = 函数
//2  方法名 = 函数  (会自动进行类型退到)

val login3 = {number1:Int,number2:Int,number3:Int ->
     number1+number2+number3
}

println(login3(1,2,3))
}

3.7、在函数中定义参数是函数

函数中定义参数是函数,这个和java中的接口回调有一定的相似。

fun main() {

    val name = "xiebin"

    val password = "123"

    //这里定义一个匿名函数

    val response = { reMsg: String, reCode: Int ->

        println("返回message是$reMsg 返回的code是$reCode")
    }

    login(name,password,response)

}

private fun login(name: String, password: String,serviceResponse:(String,Int)->Unit): Boolean {

    if (name=="xiebin"&&password=="123"){
        serviceResponse("登录成功",200)
        return true
    }else{
        serviceResponse("登录失败",400)
        return false
    }


}

你可能感兴趣的:(kotlin学习笔记,kotlin,android,学习)