Kotlin开发安卓APP笔记-类和对象(1)

其实这一篇应该是先于函数学习的,现在补上
跟Java一样,Kotlin里面类的声明使用的是关键字class,类的声明包含有三部分:类名,类头,类体,其中,类头和类体是可选的。

class Demo

类成员

1、构造器和初始化块
2、成员函数
3、属性
4、内部类
5、对象声明

构造器Constructors

一个类可以有一个主构造器或者多个次构造器

主构造函数(primary constructor)

主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。

class Demo constructor(firstName: String){
    init {
        //类在被构造的时候执行
    }
}

如果主构造器没有任何注解或者指示符,constructor关键字可以被省略。

class Demo(firstName: String){

}

相反,如果主构造器有注解或者可见的指示符,constructor是必须的。

class Demo public @Inject constructor(firstName: String) { ... }
次构造函数

次构造函数也可以叫做二级构造函数,使用时需要加前缀 constructor:

class Demo constructor(firstName: String){
    constructor(firstName:String,lastName:String):this(firstName){

    }
    init {

    }
}

需要说明的是,如果主构造函数和次构造函数同时存在,每个主构造函数需要委托到次构造函数中去,或者间接通过另一个次构造函数来委托。使用方法就是使用this,表示委托到本类的另一个构造函数中。
如果非抽象的类没有声明任何的构造函数,它默认继承一个没有任何参数的公有构造器,这个跟Java中的默认构造器类似。如果希望它继承的是一个私有的构造器,就需要显示的指明。

class Demo private constructor () {
}

创建类实例

与Java不同的是kotlin创建实例不需要new关键字

val demo=Demo()
val demo=Demo("Alan")
val demo=Demo("Alan","Walker")

类的属性

类的属性可以用关键字 var和val 声明,var声明为可变的, val声明为不可变。

class Demo {
    var name: String = "醉猫"
    var age:Int=21
    var selfIntroduction="16岁的96年新人程序员,大家多多关照"
}

要使用一个属性,可以像Java一样直接引用就行了

val demo=Demo()
demo.name
demo.age
Demo().selfIntroduction
getter 和 setter

属性声明的完整语法:

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

getter 和 setter 都是可选

如果属性类型可以从初始化语句或者类的成员函数中推断出来,那就可以省去类型,val不允许设置setter函数,因为它是只读的。

var allByDefault: Int? // 错误: 需要一个初始化语句, 默认实现了 getter 和 setter 方法
var initialized = 1    // 类型为 Int, 默认实现了 getter 和 setter
val simple: Int?       // 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化
val inferredType = 1   // 类型为 Int 类型,默认实现 getter
实例

以下实例定义了一个 Person 类,包含两个可变变量 lastName 和 no,lastName 修改了 getter 方法,no 修改了 setter 方法。

class Person {

    var lastName: String = "zhang"
        get() = field.toUpperCase()   // 将变量赋值后转换为大写
        set

    var no: Int = 100
        get() = field                // 后端变量
        set(value) {
            if (value < 10) {       // 如果传入的值小于 10 返回该值
                field = value
            } else {
                field = -1         // 如果传入的值大于等于 10 返回 -1
            }
        }

    var heiht: Float = 145.4f
        private set
}

// 测试
fun main(args: Array<String>) {
    var person: Person = Person()

    person.lastName = "wang"

    println("lastName:${person.lastName}")

    person.no = 9
    println("no:${person.no}")

    person.no = 20
    println("no:${person.no}")

}

输出结果为:

lastName:WANG
no:9
no:-1

Kotlin 中类不能有字段。提供了 Backing Fields(后端变量) 机制,备用字段使用field关键字声明,field 关键词只能用于属性的访问器,如以上实例:

var no: Int = 100
        get() = field                // 后端变量
        set(value) {
            if (value < 10) {       // 如果传入的值小于 10 返回该值
                field = value
            } else {
                field = -1         // 如果传入的值大于等于 10 返回 -1
            }
        }

非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟初始化的方案,使用 lateinit 关键字描述属性:

class LazyProperty(val initializer: () -> Int) {
    var value: Int? = null
    val lazy: Int
        get() {
            if (value == null) {
                value = initializer()
            }
            return value!!
        }
}

抽象类

和Java一样,kotlin也有抽象类,也用关键字abstract修饰
抽象是面向对象编程的特征之一,类本身,或类中的部分成员,都可以声明为abstract的。抽象成员在类中不存在具体的实现。

注意:无需对抽象类或抽象成员标注open注解。

open class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值