Koltin - 面向对象(上)

本文详细介绍了Kotlin的面向对象特性,包括继承、多态、封装,以及类的定义、主次构造器、属性、方法、访问控制符、数据类、属性与字段、幕后字段、延迟初始化和内联属性等概念,还探讨了类的继承和多态,并提供了丰富的示例。
摘要由CSDN通过智能技术生成

Kotlin支持面向对象的三大特征:继承、多态、封装。提供了private、protected、internal、public四个访问权限修饰符。

1、Kotlin定义类,语法:

[修饰符] class 类名 [constructor 主构造器]{

零到多个次构造器

零到多个属性

零到多个方法

}

修饰符:可以是public|internal|private(只能出现其中之一)、final|open|abstract(也只能出现其中之一)或者完全省略修饰符。

Kotlin类的定义:类名、类头(泛型声明、主构造器等)和用花括号包围的类体构成。类头和类体都是可选的【空类没有类体,可以省略花括号】,比如class EmptyClass。

2、一个Kotlin类有0~1个主构造器、0~N个次构造器。主构造器是类头的一部分,它跟在类名和泛型声明之后:

class User constructor(name:String){}//如果主构造器没有任何注解或修饰符,则可以省略constructor关键字。

主构造器是在类头使用constructor关键字定义一个无执行体的构造器。虽然主构造器不能定义执行体,但是可以定义多个形参,这些形参可以在属性声明、初始化块中使用。

关于默认构造器:如果没有为非抽象类定义任何的主/次构造器,系统会自动提供一个无参数的主构造器,该构造器默认用public修饰。一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。

3、类的属性

[修饰符] var|val 属性名:类型 [= 默认值]

[<getter>]

[<setter>]

修饰符:可以省略,也可以是private|protected|internal|public、final|open|abstract。

public|protected|private只能出现其中之一,final|open|abstract也只能出现其中之一。

对于属性使用protected|internal|public修饰符和不使用访问控制符,效果是一样的。如果使用private修饰该属性,该属性将作为幕后属性使用。

[<getter>]|[<setter>]:用于为该属性编写自定义的getter、setter方法。如果不指定,kotlin会为读写属性提供默认getter、setter方法,为只读属性提供默认的getter方法。

4、顶层函数与类中方法的区别

主要区别在于修饰符:顶层函数不能使用protected、abstract、final修饰符。但类中的方法可以使用private|protected|internal|public、final|open|abstract这些修饰符。

5、构造器的语法:

[修饰符] constructor (形参列表){

//零到多条可执行语句组成的构造器执行体

}

修饰符:可以省略,也可以是private|protected|internal|public其中之一

形参列表:其格式和定义方法的形参列表的格式完全相同

6、方法与函数的关系

Kotlin中的方法与函数其实是统一的,不仅定义函数和方法的语法相同,而且定义在类中的方法依然可独立出来。也就是说,即使我们将方法定义在类里面,这个方法依然可以转换为函数。

  class Person {

        var age: Int = 0

        constructor() {

            this.age = 10

        }

        fun showAge() {

            println(age)

        }

    }

    fun main(args: Array<String>) {

        var show = Person::showAge//将showAge方法独立成函数,调用showAge方法的调用者将作为第一个参数传入

        var p = Person()

        show(p)

    }

7、解构与componentN方法

Kotlin允许将一个对象的N个属性“解构”给多个变量,写法如下:

var(name,pass) = user

Kotlin是怎么知道把哪两个属性赋值给name、pass变量的?其实Kotlin会将上面的赋值代码转换为如下两行:

var name = user.component1()

var pass = user.component2()

如果希望将对象解构给多个变量,那么必须为该对象的类定义componentN方法,程序希望解构多少个变量就定义多少个componentN方法,且该方法使用operator修饰。   

 class User(name: String, pass: String, age: Int) {

        var name = name

        var age = age

        var pass = pass

        operator fun component1(): String {

            return this.name

        }

        operator fun component2(): String {

            return this.pass

        }

        operator fun component
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值