kotlin语言介绍

原文在 https://github.com/Zhuinden/guide-to-kotlin

kotlin语言语法的不同

参照java对kotlin语言进行学习,对一些概念进行类比。

常识不同(参数和类型的顺序,void = unit,Object = Any?, fun等):

  • 定义函数使用fun
  • 定义参数 name: type
  • 定义返回参数 fun funName(paramName:type) : type {}. 例子如下:
fun matches(b: ByteArray): Boolean{
    return false;
}
  • void 返回值在kotlin中是不需要显示写出来的,如果一定要显示写出来,就使用unit
  • @Override 要改成override,且是强制性的,必需显示写出来,java中不需要显示写出来。
  • 使用Any?替代Object类型
  • 没有new关键字
public abstract class BaseClass{
    //...
}

public class MyClass extends BaseClass{
    private final Map<String, Object> objects = new HashMap<>();
    
    public MyClass(){}

    @Override
    public void addToMap(String key, Ojbect value){
        objects.put(key, value);
    }
}

final MyClass myClass = new MyClass();

对应的kotlin代码如下

abstract class BaseClass{}

class MyClass : BaseClass(){
    private val objects = hashMapOf<String, Any?>()

    init {
    
    }

    ovveride fun addToMap(key: String, value: Any?){
        objects.put(key, value);
    }

    fun <T> getObject(key: String): T = 
        objects.get(key) as T
}

val myClass = MyClass()

接口和val,var还有fun

在kotlin中val和var的区别很重要:

  • var表示变量
  • val表示一个final修饰的变量。
  • 每一个var修饰的变量默认暴露getter/setter。 val修饰的只暴露了getter。
interface MyContract {
    var value: String
    
    val name: String
 
    fun doSomething(input1: String, input2: String)
}

class MyImpl(
    override var value: String,
    override val name: String
): MyContract {
    override fun doSomething(input1: String, input2: String) {
        ...
    }
}

构造函数和继承

如下,kotlin可以传递参数给supper-constructors,跟java中的super(param)一样。

class MyClass(
    tag: String,
    private val name: String,
    var mutableField: String = "" // default argument
): BaseClass(tag), MyInterface {
    override fun methodFromInterface() {
    }
}

class MyCustomView : FrameLayout {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super(context, attrs, defStyleAttr)

kotlin中可以使用constructor关键字

lateinit vars

enum

java中使用 enum ClassName{}

kotlin定义方式 enum class ClassName{}

注解

java中定义一个注解是 public @interface MyAnnotation{}

kotlin定义为 annotation class

final 和open

任何class默认都是final修饰,意味着不能继承,如果要继承一个kotlin类,那么要使用open修饰

open class SomeClass{}

循环

for(i in 0 until n){}

for(pair in pairs){
}

for((key, value) in map.entries){
}

单例

object MySingleton{
    fun doSomething(){
    }
}

Mysingleton.doSomething()

object NetWork{
    const val API_URL = "http://www.baidu.com"
    const val TIMEOUT = 1000
}

object Positions {
    @JvmStatic
    fun create(x: Int, y: Int): Int = Position(x, y)
    // ...
}

伴生对象实现静态方法, 常量

在kotlin中没有static关键字,但是kotlin中有伴生对象的概念—companion object,使用伴生对象来实现静态变量和静态方法。

class MyClassWithStatics {
    companion object {
        const val SOME_CONSTANT = "Hello!"

        @JvmField var someUglyMutableField: String = "don't do this like ever"

        @JvmStatic fun hello() { println("$SOME_CONSTANT $someUglyMutableField") }
    }
}

// consuming Java code!
public class MyOtherClass {
    public void doSomething() {
        String constant = MyClassWithStatics.SOME_CONSTANT;
        String someUglyMutableField = MyClassWithStatics.someUglyMutableField;
        MyClassWithStatics.hello();
    }
}

为什么要使用 JvmField JvmStatic注解,如果不使用,那么在java端的使用样例如下:

public class MyOtherClass {
    public void doSomething() {
        String constant = MyClassWithStatics.Companion.INSTANCE.SOME_CONSTANT;
        String someUglyMutableField = MyClassWithStatics.Companion.INSTANCE.someUglyMutableField;
        MyClassWithStatics.Companion.INSTANCE.hello();
    }
}

可见性

在java中 有 private , package protected public

在kotlin中有private , protected public(default) internal

需要注意的是 internal不是package

在kotlin中没有package这个可见性。

static修饰的内部类和kotlin中的inner

在kotlin中,内嵌类默认就等同于java中的 public static class,所以定义一个内部类,需要明确使用inner修饰. 内部类会引用外部类对象,而内嵌类不会。

倒引号的使用

在kotlin中调用java类库中的代码,有可能类库中的方法是kotlin的关键字,这时候需要使用倒引号

Mockito.`when`(text.hashCode())

kotlin中的 is和as as?

java中判断一个对象是否是某类型使用 instanceof, 而kotlin中使用is。

kotlin使用as 和as? 来进行强制类型转换

class Cat(private val name: String) {
    fun meow() {
        println("The cat $name meowed.")
    }
}

fun doSomething(obj: Any?) {
    if(obj is Cat) {
        obj.meow() // note that as `obj` is a `val`, the cast is automatic here
    }
}

强制类型转换的时候,我们不能确定时候,在kotlin中就可以使用as?,如果使用as 强制转型失败就会抛异常,而as?不会,返回的是null

(obj as? Cat)?.meow()

匿名实现类和接口

myView.setOnClickListener(object: View.OnClickListener{
    override fun onClick(view: View){
        //do something
    }
})

myView.setOnClickListener((view) -> {
    //do something
})

myView.setOnClickListener{view -> 
    //do something
}

kotlin中没有三元运算符

可以使用如下来代替

val something = if() ... else ...

val something = when {
    value != "hello" -> "beep"
    else -> "boop"
}

单行函数可以使用=代替return

fun getRepository(): Repository = repository

fun getRepository(): Repository {
    return repository
}

arrayOf / arrayOfNulls / listOf / mutableListOf / linkedMapOf

private final List<String> strings = new ArrayList<>();

private val strings = arrayListOf<String>()

val squares = List(size = 6) { index -> index * index}
//same as
val squares = ListOf(0, 1, 4, 9, 16, 25)

volatile 和@Volatile

多泛型边界

public class MyClass<T extends SomeClass & Comparable> {
    ...
}

class MyClass<T: SomeClass> { // this would be single-bounds

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

推荐阅读更多精彩内容

  • 简介 Kotlin[https://github.com/JetBrains/kotlin] 是 JetBrain...
    Whyn阅读 637评论 0 1
  • 概述 Kotlin是面向对象的静态类型语言; 在Kotlin中,所有东西都是对象,在这个意义上可以在任意变量上调用...
    CodeMagic阅读 380评论 0 0
  • Kotlin 已被设计为能够与 Java 平台轻松互操作。它将 Java 类视为 Kotlin 类,并且 Java...
    FF_911阅读 1,461评论 0 0
  • 声明,这里是我平时日常的笔记Zone,所以记录可能会偏向于我认为的重点区域,会有些疏漏或者缺失的地方,或是排版或者...
    哥哥是欧巴Vitory阅读 813评论 0 2
  • 伴生对象 在 Kotlin 中并不没有 static 这个关键字,该如何处理呢?这里需要用到 Kotlin 的伴生...
    小村医阅读 5,561评论 0 8