Kotlin的解析(上)

前言

1. Kotlin的概述:

1.1 kotlin是什么
(1)Kotlin是由JetBrains创建的基于JVM的编程语言
(2)在技术层面上,JAVA和Kotlin是同一级别的,都是以Java Byte Code形式运行在虚拟机上
1.2kotlin相对于Java有什么优势
(1)更容易学习:Kotlin是一门包含很多函数式编程思想的面向对象的编程语言
(2)轻量级:相比于其他的语言,Kotlin函数库更小,由于Android存在65K方法数限制,使得这一点比较重要
(3)高度互操作性:Kotlin可以和其他Java库友好且简单的进行互相操作
(4)非常友好的集成Android Studio 以Gradle,Kotlin又一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件。推出的AS3.0+已经集成了Kotlin
(5)Kotlin还有很多语法层面的特性,如数据模型、空指针安全、扩展函数等
1.3 kotlin能做什么
(1)服务端开发
(2)以JavaScrip方式运行
(3)开发Android App

2.Kotlin基础知识

2.1基础语法
2.1.1 定义变量:
绝大数编程语言都有常量和变量,Kotlin和同源的Java类似,尽管没有常量语法,但可以使用final关键字定一个不可以修改的变量

Java代码
int n=30;
int ok;
final int m =20;
ok =123;
m=10;
Kotlin代码
var n :Int =30
var ok:Int 
val m :Int =20 
m=10 //编译出错,因为m是常量
不同点

(1)位置不同
(2)变量和常量需要关键字:在Kotlin中,定义变量需要var,定义常量需要val开头
(3)数据类型首字母:在kotlin中,数据类型都以大写字母开头
(4)如果在定义变量时未进行初始化,就必须要制定数据类型,如果在定义变量时进行了初始化,可以不指定数据的类型,Kotlin编译器会自动根据等号右侧的值推倒数据的类型
2.1.2 定义函数
函数定义如下几个部分:
(1)函数头,包括函数名和识别函数的关键字,如fun、function等
(2)参数,包括参数名和参数类型
(3)返回值

Kotlin 代码
fun add (m: Int ,n:Int):int
{
return m+n
}

fun process(m: Int):Unit //也可以省略
{
println(m*m)
}

2.1 .3 注解
(1)但行注解 //
(2块注解//
(3)嵌套注解/
/
// 新增的Java中是不支持的

2.2 基础数据类型
2.2.1 数值类型

数据类型 占用字节数
Double 8
Float 4
Long 8
Int 4
Short 2
Byte 1
Kotlin代码
var m =29
val n :Byte=10
m=n  //编译错误,无法将Byte隐式转换为Int

var x:Long =20 //可以将Int类型的值隐式转为Long
val value:Short=20
m=value //编译错误,无法将short隐失转换为Int

如果我非要转换呢?莫急Kotlin提供了一系列的方法使用来进行类型之间的转换:

toByte()   toShort() ... toChar()

Kotlin与Java一样提供了一些特殊的表示方法,表示Long、Float以及十六进制和二进制(八进制目前还不支持)
(1)表示Long/Float类型的值,在数字后面加上L/F或者l/f
(2)表示十六进制,在数之前加0x
(3)表示二进制,数值前面加0b
(4)如果数值很大,还可以123_3454_567这样表示
2.2.2 字符类型
在Kotlin语言中,字符类型用Char描述,不过和JAVA不同的是,在Kotlin中,字符不能直接看作数字

Java代码
void check(char c){
if(c == 97){//可以编译通过
}
Kotlin代码
fun check(c: Char){
if(c == 97){//会产生编译错误
}
}

2.2.3 布尔值
Kotlin语言中的布尔类型用Boolean描述,该类型有两个值:true 和false

2.2.4 数组

//使用arrayOf 函数定义可以存储人意的数组
val arr1 = arrayOf(1,2,3,'a')
print(arr1[1])
arr1[2]='b'

//使用arrayOfNulls 函数定义数组
var arr2 = arrayOfNulls<Int>(10)

val arr3 = Array(10,{i ->(i*i).toString()}
println(arr3[3])

2.2.5 字符窜

//第一类字符串(与Java类似)
var s1 = "hello \nword"
println(s1)

//第2类字符窜,保留原始格式
var s3=""" hello
                           word
            hehhe!
"""

字符串模版

val i=10
val s1 = "I = $I"
println(s1) 

val s2 = "abd"
val str = "$s2 的长度是 ${s2.length}"
println(str)

2.3 控制流
2.3.1 条件语句
Kotlin 代码(传统的if用法)

var a = 20
var b =30
var max :Int
var min: Int
if(a>b){
max = b
}

if(a>b){
min=a
}
else{
min=b
}

Kotlin 代码(将if语句作为表达式使用)

var a=20
var b=30
val max =if(a>b)a else b
println(max)

//if.   else 后面是一个代码块,最后一个表达式将作为返回值
val min  = if(a>b){
println(a)
a
}
else{
println(b)
b
}

2.3.2 when 语句(代替了java的switch语句,功能简直是逆天)
(1)标准的when的用法

var x=1
when(x){
1 -> {
println("x == 1")
}
2->{
println("x==2")
}
else ->{
println("输出:x")
}
}

(2)when作为表达式使用

var x =1
var m = when(x){
1 ,3,4-> { //如果多个分支执行的结果一样,可以在一个分支用(,)分隔多个条件
println("x ==1")
10}
2 -> {
println("x==2")
20
} else ->{
println("x")
40
}
}

println(m)

(3)使用in关键字

var n = 25
when(n){
in 1..10 -> println("输初")
!in 30 .. 60 -> print("非30-60范围")
else -> println("条件未知")

(4)分支条件还可以式函数

fun getValue(x:Int):Int{
return x
}

var n =4
when(n){
getValue(2)->println("2")
getValue(4)->println(4)
else -> println("没有满足条件!")

2.3.3 for 循环
枚举数组中所有的元素

var arr = intArrayof(2,4,5,7,8)
for(item : Int in arr){
println(item)
}

for (i in arr.indices){
println("arr[$i] = " +arr[i])
}

2.3.4 while 循环
和Java里面式一样的,就不多说了,自己可以看一下,没啥变化的

3. 类和接口

与Java一样,在Kotlin中,类的声明也使用class,如果只是声明一个空的类的话,Kotlin和Java没有任何的区别,不过要是定义其他的成员,差别还是很大
3.1 构造器
3.1.1 主构造器
  在Kotlin中,类允许定义一个主的构造器(primary constructor)和若干个第二构造器(secondary constructor),主构造器是类头的一部分,紧跟在类名的后面,构造器参数是可选的
kotlin 代码

class Persion constructor(firstName:String){
}
//如果主构造器没有任何的注解或者修饰器,constructor关键字可以省略

class Persion(firstName:String){
}

  目前大家可能有疑惑,代码重只看的见定义主构造器,那么应该在哪里实现主构造器呢?其实,如果是主构造器的话,需要在init块中进行初始化

class Persion (firstName:String){
var name = firstName
init{
println(firstName);
}
}
//要注意的,主构造器的参数不仅可以用于在init块中,还可以用于对类属性的初始化

3.1.2 第二构造器
  (1)Kotlin类除了可以声明一个主构造器,还可以声明若干个第二构造器,第二构造器需要在类中声明,前面必须加上constructor关键字
Kotlin 代码

class Persion {
constructor(parent:Persion){
println(parent)
}
}

  (2)如若类中声明了主构造器,那么所有的第二构造器都需要在声明后面调用主构造器,或者通过另外一个第二构造器间接的调用第二构造器
Kotlin 代码

class Demo(var url : String){
//主构造器实现部分
init{
println("主构造器,嘻嘻!无知的人类")
}
//第二构造器(通过this直接调用了主构造器)
constructor(value:Int):this("https://linghit666.doubi.com")
{
println(value)
}
//通过this直接调用了主函数
constructor(des:String,url:String):this("{"+url+"}")
{
println(des+";;;;"+url)
}
//通过第二构造器间接的调用主构造器
constructor():this(20)
{
println("https://www.doubi.com")
}
}

注意:在主构造器参数重可以使用var和val,但第二构造器中不能使用var和val,意思就是第二构造器的参数都是直读的,不能在构造器的内部改变参数值
3.1.3 Kotlin 中的Singleton模式
Kotlin 代码(Singleton 模式)

class Singleton private constructor() {
   private object mHolder {
       var INSTANCE = Singleton()
   }

   companion object {
       fun getInstance(): Singleton {
           return mHolder.INSTANCE
       }
   }
}
//是不是感觉大吃一惊,相对于Java的单例模式,是不是很懵逼,之所以Kotlin方式不同,主要因为Kotlin类不支持静态方法和成员,由于kotlin支持全局函数和变量,因此可以直接使用全局函数和变量来代替静态方法和静态成员变量

3.1.4 Kotlin 函数中默认参数
  现在的很多语言都支持默认参数,例如js、dart、go等,但是遗憾的是Java并不支持,是不是很气,但是值得庆幸的是Kotlin却是支持默认参数

class Persion(val name:String="Bill",var value :Float = 20.4f,sex :Int) {
  //其实这个是Kotlin的一个语法糖,想知道原理的可以反编一下,查看一下字节码,应该就会懂了
}

3.2 类成员
  Kotlin 中属性的语法

var/val <propertyName>[:<propertyType>][=<property_initalizer>]
[<getter>]
[<setter>]

3.2.1 属性的getter和setter 形式
  由于Kotlin从语法上支持属性,因此并不需要为每一个属性单独定义getter和setter方法
Kotlin 代码

class Persion {

   private var name: String = "sdfsfd"
   fun getName(): String {
       return name
   }

   var value: Int = 0
       get() = field
       set(value) {
           field = value
           Log.i("tag","数值: " +";;;;" +value)
       }

}

3.3 类的继承
3.3.1 修饰符

private :仅仅在类的内部可以访问
protected:类似上面的,但是可以在子类中也可以访问
internal:任何在模块内部的类都可以访问
public:任何的类都可以访问

示例:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4 //默认的是public

    protected class Nested {
        public val e: Int = 5
    }
}

class SubClass : Outer() {
    //a不能访问,b、c、d、Nested().e都可以访问
    override val b: Int = 10 //重写父类的常量b
    init {
        b
        c
        d
       Nested().e
    }

}

3.3.2 类的继承
  与Java不同,Kotlin类的继承需要使用(:)冒号,而JAVA你懂得,注意,冒号后面需要调用父类的构造器,与JAVA一样,都是单继承,Kotlin默认时class是final的,也就是说,默认的时候不允许继承,需要显示的使用open

open class Parent {//使用open声明,才能允许其他类继承
open val name :String ="know"
    protected var sex =1;
    open protected fun  getYcSex():Int{
        return sex
    }

}

class Child :Parent(){
override var name:String ="wukong"
    override fun getYcSex(): Int {
        return super.getYcSex()
    }
}
//如果在子类中重写方法,就需要在父类相应的方法前面加open,而且要在子类的方法前面加override
//如果想阻止子类的方法被重写,就要在override前面加final
//属性重写与方法类似,被重写的属性前面需使用open声明,子类的属性前加override,注意的是,val属性可以被重写成var的,反之不行

3.4 接口
  Kotlin中的接口与Java类似,使用interface关键字声明,一个类可以实现多个接口,而且接口中的属性以及方法都是open的

3.4.1接口的示例

interface Extend{
    fun  process()
    fun getYcName():String{
    //允许接口包含默认的方法体,有方法体的,不要求一定重写
        return "nihao"
    }
}


class Child :Parent(),Extend{
    override fun process() {

    }

    override fun getYcName(): String {
      // 可以不重写
        return super.getYcName()
    }

    override fun getYcSex(): Int {
        return super.getYcSex()
    }
}

3.4.2抽象类
抽象方法不需要使用open声明,因为抽象方法类本身都可以继承

abstract class ChouXiang :Extend{
    abstract fun hellow()
}

class Persion :ChouXiang() {
    override fun hellow() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun process() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}
总结

截止目前的话Kotlin中大概的基础知识,差不多都示例讲解了一下,基本的一些东西都可以看懂知道了,希望对你想了解kotlin有些帮助

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容