Kotlin相关基础及与Java的不同 的 笔记(一)

来源:互联网 发布:mac ppt 页面无法显示 编辑:程序博客网 时间:2024/06/08 17:23

最近在看Kotlin学习资料,还是做个笔记,记一下相关的知识点.
好歹什么时候还能回顾一下,如果能帮助到其他人那就更好了
如果存在错误的地方,给我评论我进行修改啊.

0.

Kotlin内没有 包装类,系统会自动根据实际情况进行转换.
如: Kotlin的 Int 是 介于 java的 int 和其包装类Integer 之间的.不需要在传入对象时进行包装.


1.

Kotlin 不允许隐式转换,及Int自动转换为long 这种.
必须.toLong()等函数进行转换才行.


2.

Kotlin内 == 和 .equals()是完全等价的.
== 点进去会发现,其实调用的就是 .equals()


3.

Kotlin内比较对象的 引用值,得使用 ===
也就是 Java内的 .equals 等价于 Kotlin的 ==
Java内的 == 等价于 Kotlin的 ===


4.

Kotlin的字符串模板 $str…

var aInt : Int = 0var bInt : Int = 1//java的写法:println(""+ aInt + " + " + bInt + " = " + (aInt + bInt))//Kotlin的写法println("$aInt + $bInt = $(aInt + bInt)")

5.

原始字符串

var aStr : String  = """这个里面的内容会直接打印,不会进行转译\t\n"""

同时在原始字符串内支持,字符串模板,但是同时需要输出$符号时,空格啊


6.

Kotlin的空类型安全
Kotlin内String是默认不允许为null的,
比如:

var str:String  = null

这样是不允许的,
这种默认情况,是不需要对str的值做判断,因为判断非空肯定返回的是false
如果实在是需要为null,需要修改为:

var str:String ? = null

在变量的类型后面添加一个?,表明该变量可以为null
但是这样,实际使用中,又得对其非空做判断
Kotlin内可以对一个方法的返回值可能为null的非空判断改为

//一个允许返回为空的方法fun getStr():String?{    return null}//Android,做非空判断if(!TextUtils.isEmpty(getStr)){    //doSomething}else{    return;}//Kotlin内,非空判断,为空返回var str :String = getStr() ?: return//doSomething

Kotlin可以通过 ?:retun 作为非空判断,当为空直接返回return,否则就获得对应方法的值(仅适用于为null直接return)
?: 这个运算符叫 Elvis操作符

同时,在Kotlin内使用可能为空变量时(即主动声明,添加?,表明允许为null),可以在变量后面 添加 !! ,表明我已充分了解该变量,当前肯定不会为null.当然当它真的为null,肯定还是会crash的,不过那样就是你自己的锅咯.


7.

Range…
区间

//闭区间,[0,1024]var  aRange:IntRange = 0...1024//半闭区间,[0,1024)var bRange:IntRange = 0 until 1024

Range的迭代使用for(i in range){}


8.

Kotlin内的var和val
var ==> variable
val ==> value

val同Java内的final常量类似
可以不用声明类型, 类型推导能自动根据赋值的类型进行自动判断

//虽然值不可变,但是其实还是一个变量val FINAL_STR = "HelloWorld"//这个才是和Java的final类型一样,属于编译期常量const val FINAL_S = "HelloKotlin"

9.

Kotlin的返回值…
在Java内,当一个函数没有返回值时,是写作void
在Kotlin内,当一个函数没有返回值是可以不写的,其实这种情况该函数的返回值为Unit

fun setName() : Unit{}

10.

Kotlin的迭代写法与lambda表达式

//1.最常见的for循环for(i in args){    println(i)}//2.forEach与lambda表达式args.forEach{    println(it)}//2.1 这其实是一个lambda表达式args.forEach({it -> println(it)})//2.2 因为只有一个参数,可以将这个参数省略掉args.forEach({println(it)})//2.3 因为结尾是lambda表达式,可以将lambda的大括号写出来args.forEach(){println(it)}//2.4 因为小括号内没有内容,小括号可以省略args.forEach{println(it)}//2.5 可以使用引用,::来引用println函数名,作为参数传递给forEachargs.forEach(::println)
  • 只要函数最后一个参数是lambda表达式,就可以将这个lambda表达式整体(包含大括号以及大括号里面的内容)移动到外面(小括号后面)
  • 如果这个小括号里面什么东西都没有,可以将这个小括号直接删掉
  • 如果传入的函数和需要接收的这个lambda的类型是一样的,可以直接使用::引用

11.

  • lambda表达式并不是函数,在里面进行return将会对整个main函数进行return
  • 需要对lambda表达式进行判断,跳过该次需要:
//XXX为自定义名称args.forEach XXX@{    if(it == "a") return@XXX     println(it)}

12.

在Kotlin内,所有的参数,函数都是有类型的.

参数的类型有Int,Long,String,自定义的XXX

函数的类型看其对应的参数和返回值.
比如没有传参和返回值的,它的类型是()->Unit.
其实是有具体的.即function0,具体的:
function0 ~~~~ function22
一个函数对应有X个参数,及该函数的类型为functionX

Kotlin内不支持有23个及更多的参数的函数,及不存在function23类型,会报错,说function23不存在.


13.

关于Kotlin的延时加载.
var 类型的延时加载,可以不进行初始化,在使用时再进行初始化,但是必须得 添加延时 (lateinit)

lateinit var a:String

需要注意的是,添加了lateinit,在使用中一定就得注意进行初始化后使用,否则会直接Crash

val类型的延时加载.和var类型不一样,lateinit只能修饰与var,
val类型的延时加载,使用by lazy:

//lambda: ( ) -> Tval s:String by lazy{    //lambda表达式没有参数,返回的是T类型,即String    //即返回一个 延时加载的String类型的值    //如"","helloWorld"}

14.

Kotlin的属性访问控制
即属性的getter和setter

  • 在Kotlin内,默认的访问类型是public
  • 在Kotlin内,默认对属性实现了getter和setter方法
  • 如果需要对属性的getter和setter进行复写,如下:
    //等同于默认的getter和setter    class A{        //类型推导        var a = 0            //这里的field指代的就是a本身的值...            set(value){                field = value            }            get( ){                return field            }    }
  • 可以对getter和setter进行访问控制,及添加protected,private,可以只对其访问进行权限控制
    class A{        var a = 0            protected set            get    }
阅读全文
0 0
原创粉丝点击