分类目录归档:kotlin

kotlin对象表达式和声明


有时候我们想要创建一个对当前类有一点小修改的对象,但不想重新声明一个子类。java 用匿名内部类的概念解决这个问题。Kotlin 用对象表达式和对象声明巧妙的实现了这一概念。

对象表达式

通过下面的方式可以创建继承自某种(或某些)匿名类的对象:

window.addMouseListener(object: MouseAdapter () {
    override fun mouseClicked(e: MouseEvent) {
        //...
    }
})

如果父类有构造函数,则必须传递相应的构造参数。多个父类可以用逗号隔开,跟在冒号后面:

open class...

阅读全文...

kotlin枚举类


枚举类最基本的用法就是实现类型安全的枚举

enum class Direction {
    NORTH,SOUTH,WEST
}

每个自举常量都是一个对象。枚举常量通过逗号分开。

初始化

因为每个枚举都是枚举类的一个实例,它们是可以初始化的。

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

匿名类

枚举实例也可以声明它们自己的匿名类

enum class ProtocolState {
    WAITING {
        overri...

阅读全文...

kotlin泛型


像 java 一样,Kotlin 中的类可以拥有类型参数:

class Box<T>(t: T){
    var value = t
}

通常来说,创建一个这样类的实例,我们需要提供类型参数:

val box: Box<Int> = Box<Int>(1)

但如果类型有可能是推断的,比如来自构造函数的参数或者通过其它的一些方式,一个可以忽略类型的参数:

val box = Box(1)//1是 Int 型,因此编译器会推导出我们调用的是 Box<Int>

变型

java 类型系统最棘手的一部分就是通配符类型。但 kotlin 没有,代...

阅读全文...

kotlin嵌套类


类可以嵌套在其他类中

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() //==2

内部类

类可以标记为 inner 这样就可以访问外部类的成员。内部类拥有外部类的一个对象引用:

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val de...

阅读全文...

kotlin数据类


我们经常创建一个只保存数据的类。在这样的类中一些函数只是机械的对它们持有的数据进行一些推导。在 kotlin 中这样的类称之为 data 类,用 data 标注:

data class User(val name: String, val age: Int)

编译器会自动根据主构造函数中声明的所有属性添加如下方法:

equals()/hashCode 函数

toString 格式是 "User(name=john, age=42)"

compontN() 对应按声明顺序出现的所有属性

copy() 函数

如果在类中明确声明或从基类继承了这些方法,编译器不会自动生成。

为确保这些生成代...

阅读全文...

Kotlin扩展


与 C# 和 Gosu 类似, Kotlin 也提供了一种,可以在不继承父类,也不使用类似装饰器这样的设计模式的情况下对指定类进行扩展。我们可以通过一种叫做扩展的特殊声明来实现他。Kotlin 支持函数扩展和属性扩展。

函数扩展

为了声明一个函数扩展,我们需要在函数前加一个接收者类型作为前缀。下面我们会为 MutableList<Int> 添加一个 swap 函数:

fun MutableList<Int>.swap(x: Int, y: Int) {
    val tmp = this[x] // this 对应 list
    this[x] = this...

阅读全文...

Kotlin可见性修饰词


类,对象,接口,构造函数,属性以及它们的 setter 方法都可以有可见性修饰词。( getter与对应的属性拥有相同的可见性)。在 Kotlin 中有四种修饰词:private,protected,internal,以及 public 。默认的修饰符是 public。 下面将解释不同类型的声明作用域。

函数,属性和类,对象和接口可以在 "top-level" 声明,即可以直接属于包:

// 文件名: example.kt
package foo

fun baz() {}
class bar {}

-- 如果没有指明任何可见性修饰词,默认使用 public ,这意味着你的声明在...

阅读全文...

Kotlin接口


Kotlin 的接口很像 java 8。它们都可以包含抽象方法,以及方法的实现。和抽象类不同的是,接口不能保存状态。可以有属性但必须是抽象的,或者提供访问器的实现。

接口用关键字 interface 来定义:

interface MyInterface {
    fun bar()
    fun foo() {
        //函数体是可选的
    }
}

实现接口

一个类或对象可以实现一个或多个接口

class Child : MyInterface {
    fun bar () {
        //函数体
    }
}

接口中的属性

可以在接口中申明属性。接口...

阅读全文...

Kotlin属性和字段


属性声明

在 Kotlin 中类可以有属性,我们可以使用 var 关键字声明可变属性,或者用 val 关键字声明只读属性。

class Address {     
    var name: String = ...
  var street: String = ...
    var city: String = ...
  var state: String? = ...
    var zip: String = ...
}

我们可以像使用 java 中的字段那样,通过名字直接使用一个属性:

fun copyAddress(address: Address) : Address...

阅读全文...

Kotlin类和继承


在 Kotlin 中类用 class 时:

class Invoice {
}

类的声明包含类名,类头(指定类型参数,主构造函数等等),以及类主体,用大括号包裹。类头和类体是可选的;如果没有类体可以省略大括号。

class Empty

构造函数

在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的类型参数)。

class Person constructor(firstName: String) {
}

如果主构造函数没有注解或可见性说明,则 constructor 关键字是可以省略:

class Person(f...

阅读全文...