面向对象编码


前言

  和很多现代高级语言一样,Kotlin也是面向对象编程。不同于面向过程的语言(比如C语言),面向对象的语言是可以创建类的。类就是对事物的一种封装,比如说人、汽车、房屋、书等任何事物,我们都可以把它封装成类,类名通常是名词。而类中又拥有自己的字段和函数,字段表示该类所拥有的属性,比如说人可以有姓名和年龄,汽车可以有品牌和价格,这些就属于类中的字段,字段名通常也是名词。而函数则表示该类可以有哪些行为,比如说人可以吃饭和睡觉,汽车可以驾驶和保养等,函数名通常是动词。
  通过这种类的封装,我们就可以再适当地时候创建该类的对象,然后调用对象中的字段和函数来满足实际编程的需求,这就是面向对象编程最基本的思想。当然,面向对象编程还有许多其他特性,如继承、多态等。


一、类与对象

kotlin中也是使用class关键字来声明一个类的,这一点和Java一致,接下来我们先定义一个Person类。代码如下:

class Person {
    var name = ""
    var age = 0

    fun eat(){
        println(name +"is Eating.He is"+age+"Year old")
    }
}

上述代码中使用var关键字创建了name和age这两个字段,这是因为我们需要在创建对象之后再指定具体的姓名和年龄,而如果使用val关键字的话,初始化之后就不能再重新赋值了。接下来定义了一个eat()函数,并在函数中打印了一句话。

二、继承和构造函数

继承是基于现实场景总结出来的一个概念,比如我们需要定义一个Student类,每个学生都有自己的学号和年级,因此我们可以在Student类中加入sno和grade字段。但同时学生也是人呀,学生也会有姓名和年龄,也需要吃饭,如果我们在Student类中重复定义name、age字段和eat()函数的话就显得太过冗余了。这个时候可以让Student类去继承Person类,这样Student类就自动拥有了Person中的字段和函数,另外还可以定义自己拥有的字段和函数。
Kotlin在设计时候默认所有的非抽象类都是不可以被继承的,是因为抽象类本身是无法创建实例的,一定要由子类去继承它才能创建实例。所以Person类在默认情况下是无法被继承的,但是我们必须得让它能够被继承,只需要早Person类的前面加上open关键字就可以了,如下所示:

open class Person {
    var name = ""
    var age = 0

    fun eat(){
        println(name +"is Eating.He is"+age+"Year old")
    }
}

第二件事,要让Student类继承Person类。在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号,写法如下:

class Student : Person(){
    var sno = ""
    var grade = 0
}

任何一个对象的编程语言都有构造函数的概念,Kotlin也有,但是Kotlin将构造函数分成了两种:主构造函数和次构造函数。

主构造函数是十分常用的构造函数,每个类默认都会有一个不带参数的主构造函数,当然也可以显示的给它指明参数。主构造函数的特点是没有函数体,直接定义在类名的后面即可。比如下面这种写法:

class Student(val sno: String, val grade: Int) : Person() {

 }

这里我们将学号和年级这两个字段都放到主构造函数当中,这就表明在对Student类进行实例化的时候,必须传入构造函数要求的所有参数。比如:

	val student = Student("a123",5)

这里我们就创建了一个Student的对象,同时指定该学生的学号是a123,年级是5。另外,由于构造函数中的参数是在创建实例的时候传入的,不像之前的写法那样还得重新赋值,因此可以将参数全部声明成val.

如果我们需要在主构造函数中编写一些逻辑的时候需要怎么做呢。别担心,Kotlin给我们提供了一个init构造体,所有主构造函数中的逻辑都可以写在里面:

 class Student(val sno: String, val grade: Int) : Person() {
        init {
            println("sno is" + sno)
            println("grade is" + grade)
        }
    }

Kotlin规定,当一个类既有主构造函数又有次构造函数时,所有的次够着函数都必须调用主构造函数,这里我举一个例子,代码如下:

class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
    constructor(name: String, age: Int) : this("", 0, name, age) {

    }

    constructor() : this("", 0) {
        
    }
}

次构造函数是通过constructor关键字来定义的,这里我们定义了两个次构造函数,第一个次构造函数接收name和age参数,然后它又通过this关键字调用了主构造函数,并将sno和grade这两个参数赋值成初始值;第二个构造函数不接收任何参数,它通过this关键字调用了第一个次构造函数,并将name和age参数也赋值成初始值。

接口

我们都知道,Java是单继承结构的语言,任何一个类最多只能继承一个父类,但是却可以实现任意多个接口,Kotlin也是如此
首先让我们先定义一个Study接口,接口的定义方法与Java中接口定义方式基本一致。代码如下:

interface Study {
    fun readBooks()
    fun doHomework()
}

接下来就可以让Student类去实现Study接口,代码如下:

class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) ,Study{
    override fun readBooks() {
        TODO("Not yet implemented")
    }

    override fun doHomework() {
        TODO("Not yet implemented")
    }

}

熟悉Java的人一定知道,Java中继承使用的关键字是extends,实现接口使用的是关键字implements,
而Kotlin中统一使用冒号,中间用逗号进行分隔。Study接口中定义了readBooks()和doHomework()两个待实现函数,因此Student必须实现这两个函数。kotlin中使用override关键字来重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值