2.5--Kotlin面向对象编程

2.5.1类与对象

在Kotlin 项目中创建类文件需要在包名右键New  -- Kotlin File/Class ,默认选择的是File 用于书写Kotlin 顶层函数和扩展函数,创建类对象的话可以选择Class 然后在Name 中写类名 点击OK 完成创建,在Kotlin 中也是使用class 关键字来声明一个类的与Java 一致 ,注意是小写的class哦在类中 我们可以定义 变量、常量以及 函数 等,变量使用 var,常量使用val 关键字,在类中定义全,变量的时候一定要给初始值不然会报错,函数使用 fun 关键字定义,例如:

class Person {
    var name = ""
    var age = 0
    fun eat(){
        println("$name + is eating. He is $age years old")
    }
}

而实例化这个类只需要 val 变量名 = 类名() ,在Kotlin 中实例化一个类是不需要new 关键字的,调用类中的函数 变量名.函数() ,也可以通过这种方式给类中的非私有类型赋值直接,Kotlin 中是有private 关键字的例如:

fun main() {
    val p = Person()
    p.name = "咪咪"
    p.age = 2
    p.eat()
}

2.5.2继承与构造函数

简短解说 和 Java 中的继承 大体意义上都是相同的,只是编写方式不同,比如我们需要创建一个Student类,StudentPerson 类的一切行为,我们该怎么做呢?在Student 类中 重复去写 Person 类中的函数和变量吗?那样的代码岂不是很冗余。我们可以让Student 去继承Person 这样我们就可以不用去重写Person 中的函数和变量了,因为子类可以调用父类一切非私有的函数和变量。

在Kotlin 中所有的类 默认都是不可以被继承的!这点与Java 在类 前面加 final 的作用是一样的,只是Java 的类默认可以被继承,而Kotlin 则相反,默认都不可以被继承, 需要在定义类 时候在class 关键字前添加关键字open 的类才可以被继承,例如:

open class Person {
    var name = ""
    var age = 0
    fun eat(){
        println("$name + is eating. He is $age years old")
    }
}

而继承的方式则与之前定义变量时候 直接显示定义类型一样,在Kotlin 中没有extends 关键字,取代的是符号 ,继承的写法如下

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

这里需要解释一下,为什么Kotlin 继承父类要在后面加上小括号(),这是Kotlin 的语法,每一个类都有一个默认无参主构造,而且子类继承父类必须调用父类的构造方法,这里的语法就是继承了父类并且调用了父类的无参构造!

我们还可以给子类的主构造添加参数,例如:

class Student1(val son:String ,val grade:Int):Person(){
    
}

当然我们如果这个类中只是为了初始化常量,里面什么都不做,那么我们可以将{} 去掉!这是一个语法糖!例如:

class Student1(val son:String ,val grade:Int):Person()

在构造函数内 的参数之前加上val 或者var 关键字就是直接将传入的参数声明成为全局的。

如果我们需要在构造函数的时候执行逻辑初始化逻辑代码怎么办?显然这和Java 中的构造并不相同,Kotlin 有一个init{} 结构体是用来做类的初始化用的,在Java 中写在构造函数中的逻辑可以写在这里面,init{} 结构体是可以有多个的,按照代码的顺序依次执行!例如:

class Student2(val son:String,val grade: Int):Person(){
    init {
        println("结构体init1")
    }
    init {
        println("结构体init2")
    }
}

我们继承的父类也可以有带参数的主构造,我们要在继承的时候传入参数,可以手动填写参数,也可以传入子构造中接收的参数,例如:

class Student3(val son:String,val grade: Int,name:String,age:Int):Person1(name,age){
    init {
        println("结构体init1")
    }
    init {
        println("结构体init2")
    }
}

在Kotlin 中没有重载构造方法,但是可以创建次构造。需要在类中 使用constructor 关键字创建次构造,可以创建多个次构造,由于子类必须执行父类的构造方法,所以在子类的次构造中,必须调用父类的构造方法,也就是继承当前类的的主构造。例如:

class Student4(val son:String,val grade: Int,name:String,age:Int):Person1(name,age){
    init {
        println("结构体init1")

    }
    init {
        println("结构体init2")
    }
    constructor(name:String,age:Int):this("", 0, name, age){

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

次构造通过this 继承并调用了主构造并且传入主构造需要的参数!!!

还有一种继承方式就是主构造无参,直接继承了父类,父类也不写参数,那么我们知道不写参数就无法调用构造,我们就需要在次构造中调用父类的构造方法!例如:

class Student5:Person1{
    constructor():super("",0){
        
    }
}

2.5.3接口

Kotlin 接口的特性和Java 是完全一致的,接口是用于实现多态编程的重要组成部分。创建接口文件 右键项目目录 -- New -- Kotlin File/Class 选择 Interface 。在Java1.8以后接口可以给 函数定义默认函数体!Kotlin 也是一样!这个带有默认结构体的函数,可以在实现它的类中不重写。我们创建一个接口,例如:

interface Study  {
    fun readBooks()
    fun doHomework()
    fun textPassword(){
        println("没毛病默认的接口结构体")
    }
}

Kotlin 实现一个结构和继承的方式一样,多个实现和继承用逗号区分!,并且重写接口中的方法,重写的方法特种在fun 关键字前有 override 关键字,例如:

class Student6():Person(),Study{
    override fun readBooks() {
        TODO("Not yet implemented")
    }

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

    
}

我们在该类实现的Study接口,那么它也属于Study 类型,我们可以运用多态的特点,来传递参数!例如:

fun main() {
    val stu = Student6()
    doStudy(stu)
}
fun doStudy(study: Study){
    study.readBooks()
    study.doHomework()
}

 

在Kotlin 中也有public、private、protected 几个修饰符关键字,但是没有default ,而是internal ,public、private、:和Java的一样,而protected 则是只对当前类和子类可见不对包名目录下的类可见,internal 这个修饰符是Kotlin 的新概念,因为Kotlin 是存在模块开发的,所以这个internal 修饰符的意思就是只允许模块内部调用,不暴露给外部!Kotlin 默认的修饰符是public。

2.5.4数据类与单例类

Android的架构模式有MVC、MVP、MVVM等等这样的架构,不管哪种模式的架构,其中的M代表的都是数据源,也就是数据类Model。

Kotlin 创建数据类很简单,只需要在数据类前面加入data 关键字,Kotlin 会自动的生成 equals()、hashCode()、toString()、这三个函数,当然数据类必须主构造中带有形参,也就是必须传入参数。例如:

data class Cellphone(val name:String,val price:Int) {
    
}

Kotlin 中也有单例模式的类,在Java 中需要定义很多方法,声明静态变量,写getInstance() 静态有锁方法,但是Kotlin 有自己的方式声明单例模式的类,就是将class 关键字换成object 就可以了,调用单例类的方式和Java 调用静态类中的方法一样,Kotlin会自己在背后自动创建 静态类的实例,例如:

object Singleton {
    fun singletonTest(){
        println("哈哈成功调用")
    }
}
fun main() {
    Singleton.singletonTest()
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值