热门搜索 :
考研考公
您的当前位置:首页正文

Kotlin 类和对象

来源:东饰资讯网

Kotlin 类可以包含:

构造函数和初始化代码块(init)、

函数、

属性、

嵌套类和内部类、

对象声明

1.使用关键字class声明一个类

class Test{
}

类声明由类名、类头(指定其类型参数、主构造函数等)和由大括号包围的类体构成。类头和类体都是可选的; 如果一个类没有类体,可以省略花括号。class Empty

2. 构造器和初始化

  • 关于构造器,kotlin中有一个主构造器,还可以有多个次构造器,主构造器是类头部的一部分,位于类名称之后。

class Person constructor(firstName: String) {
}
  • 如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。

class Person(firstName: String) {
}
  • 主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer blocks)中,同时要知道主构造的参数可以在初始化块中使用。它们也可以在类体内声明的属性初始化器中使用:

class Test(id:Int,type:String) {
    //属性 val不可变 var可变
    var id:Int=0
    var name:String="mangguo"
    init {
        //两种方式初始化
        this.id=id
        name=type
    }
    //主构造的参数也可以在类体内声明的属性初始化器中使用
    var typeUpper=type.toUpperCase()
    fun print(){
        println("id:"+id)
        println("name:"+name)
        println("typeUpper:"+typeUpper)
    }

}
------------------------------------------------------
此时在主函数调用这个类的print方法
kotlin中没有new关键字
我们可以像使用普通函数那样使用构造函数创建类实例:
   var test=Test(4,"adcdefGHI")
   test.print()
------------------------------------------------------
输出结果
id:4
name:adcdefGHI
typeUpper:ADCDEFGHI
  • 如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面:

class Customer public @Inject constructor(name: String) { …… }
  • 如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。如果你不希望你的类有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数:

class DontCreateMe private constructor () {
}

3.函数

class Runoob() {
    fun foo() { print("Foo") } // 成员函数
}

4.属性

class Test{
    var name: String = ……
    var url: String = ……
    var city: String = ……
}
对于类中对象的引用,使用 . 号来引用
var test=Test()
test.name
test.url

对于可变属性var默认有getter和setter
对于只读属性val没有setter
我们可以编写自定义的访问器,非常像普通函数,刚好在属性声明内部。

格式:
var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
例子:自定义访问器
val isEmpty: Boolean
    get() = this.size == 0
例子:自定义setter
var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value) // 解析字符串并赋值给其他属性
    }

5.嵌套类和内部类

嵌套类:类可以嵌套在其他类中

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 demo = Outer().Inner().foo()
输出
1

6.对象声明:

它总是在 object 关键字后跟一个名称。 就像变量声明一样,对象声明不是一个表达式,不能用在赋值语句的右边。

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ……
    }

    val allDataProviders: Collection<DataProvider>
        get() = // ……
}
要引用该对象,我们直接使用其名称即可:
DataProviderManager.registerDataProvider(……)
Top