Kotlin

Kotlin

2016-04-19  本文已影响3622人  CatDog118
buildscript {

    ext.kotlin_version = '1.0.0'
    
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'me.tatarka.retrolambda'

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Lambda

  1. 通过表达式代替@Functionalinterface(只包含一个方法的接口)
  2. 如果主体只有一条语句,可省略{}return语句后面的;
// 参数类型可写可不写
view.setOnClickListener((view) -> {});

基础

变量

可以return null的函数,其返回类型都要加上?

数组

类型安全

函数

相等

For

OOP

  1. 默认都是final

  2. package import和java一致,如果出现导入报名冲突可以使用as

    import foo.Bar
    import bar.Bar as bBar
    

构造函数

  1. 主构造函数只有一个,是类头的一部分跟在类名后面

    • 主构造函数的参数

      class Person (firstName: String) {
          init {} // 主构造函数初始化代码
      }
      
      // 等价于
      public final class Person {
          public Person(String name) {
              // init{}
          }
      }
      
    • 主构造函数 + 属性

      class Person(val name: String, var age: Int) {}
      
      // 等价于
      public final class Person {
          private final String name;
          private int age;
          
          public Person(@NotNull String name, int age) {}
          
          // getter setter
      }
      
    • 如果一个类没有声明任何构造函数,将会生成一个不带参数的主构造函数

  2. 二级构造函数,使用constructor

    class Person(val name: String) {
        constructor(name: String, parent: Person): this(name) {}
    }
    
  3. 创建实例:没有<del>new</del>关键字,直接调用构造函数

    val person = Pserson("ss");
    

属性

要使用属性只需要使用名称引用即可,就相当于java中的public字段


继承:

所有类的共同父类Any,不属于java.lang.Object,没有任何成员变量,甚至没有equals()hashCode()toString()

普通类

  1. 继承的类有主构造函数

    open class Base(p: Int) {}
    
    class Derived(p: Int) : Base(p) {}
    
  2. 没有主构造函数,那么每个二级构造函数使用super或者委托给另一个构造函数

    class MyView : View {
        
        constructor(context: Context) : super(context) {
        }
        
        constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        }
    }
    

抽象类 & 接口

单例

object SDKFactory {
    fun say(name : String) {
        println("hello ${name}")
    }
}
SDKFactory.say("CatDog")    // SDKFactory.INSTANCE.say("CatDog")
public final class SDKFactory {
    public static final SDKFactory INSTANCE;
    
    private SDKFactory() {
        INSTANCE = (SDKFactory)this;
    }
    
    static {
        new SDKFactory();
    }
    
    public final void say(@NotNull String name) {
        // ..
    }
}
上一篇 下一篇

猜你喜欢

热点阅读