class MyClass {
}
一个主构造函数以及多个二级构造函数
class Person constructor(firstName: String) {
}
//也可以省略constructor,写成:
class Person(firstName: String) {
}
在@Inject的时候不能省略constructor
class Person @Inject constructor(firstName: String) {
}
初始化代码可以放在以init做前缀的初始化块内
class Person(firstName: String) {
init {
Log.d("Person", Person initialized with name ${name}")
}
}
声明属性并在主构造函数中初始化:
class Person(val firstName: String, val lastName: String, var age: Int) {
}
所有的类都有共同的父类 Any. 声明一个明确的父类,需要在类头后加冒号再加父类:
open class Base(p: Int)
class Derived(p: Int) : Base(p)
kotlin中所有的类都是final, 允许别的类继承这个类需使用open或者abstract关键字
抽象类或函数默认是带着的open注解的
open class Base {
open fun f() {}
}
abstract class Derived : Base() {
override abstract fun f()
}
类似java的静态方法调用
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
类可以标记为 inner 这样就可以访问外部类的成员.内部类拥有外部类的一个对象
引用
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() //==1
tv_hello.setOnClickListener(object: View.OnClickListener{
override fun onClick(v: View?) {
}
})
//或者lambda表达式
tv_hello.setOnClickListener{}
类可以嵌套在其他类中
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
属性加上 lateinit 修饰符
laterinit var name: String
internal 修饰符是指成员的可见性是只在同一个模块中才可见的
fun MutableList.swap(x: Int, y: Int) {
val temp = this[x] // this 对应 list
this[x] = this[y]
this[y] = tmp
}
常见的扩展比如toast,可以扩展Context类
fun Context.toast(message: String, length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, length)
}
扩展属性,获取list中的最后一个index
val <T> List<T>.lastIndex: Int
get() = size-1
我们经常创建一个只保存数据的类, 用 data 标注
data class User(val name: String, val age: Int)
如果数据类有无参构造函数,需将主构造函数中,将成员属性初始化。
data class User(val name: String = "", val age: Int = 0)
和Java类似,这里的T就是泛型的对象,声明一个泛型类
class Box<T>(t: T){
var value = t
}
创建实例
val box: Box<Int> = Box<Int>(1)
声明一个泛型函数,T表示类型,这里处理了Int,String和其他
fun print(content: T) {
when (content) {
is Int -> println(content)
is String -> printlin(content)
else -> println("unkown type")
}
}