Kotlin语言之面向对象编程

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin语言之面向对象编程相关的知识,希望对你有一定的参考价值。

1. Kotlin语言之面向对象编程


这里定义了一个Person类 , 它哟有 姓名,年龄的成员变量和 eat的成员方法
class Person 
    var name = ""
    var age = 0
    fun eat() 
        println("$name is eating. He is $age years old.")
    

接下来我们来对类进行实例化:

Kotlin语言实例化的方式与Java类型, 但去掉了new关键字. 
之所以这么设计, 是因为当你调用了某个类的构造函数, 
你的意图就是将类进行实例化, 所以即使没有new关键字,
 也能够清晰的表达你的意图.

val p = Person()

接下来在main函数中对对象p进行一些操作
fun main() 
    val p = Person()
    p.name = "Tom"
    p.age = 18
//    调用p的 eat方法
    p.eat()

运行结果:


2. 继承与构造函数

Kotlin中一个类默认是不可以被继承的,如果想要让一个类可以被继承,需要主动声明open关键字:

open class Person

要让另一个类去继承Person类,则需要使用冒号关键字:

class Student : Person()

var sno = ""

var grade = 0

现在Student类中就自动拥有了Person类中的字段和函数,还可以定义自己独有的字段和函数

Kotlin将构造函数分为了2种: 主构造函数和次构造函数


2.1 主构造函数

主构造函数是最常用的构造函数, 每个类都会默认的有一个不带参数的主构造函数,
可以显示的它指明参数. 主构造函数没有函数体, 直接定义在类名后面即可. 如:

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

代码验证:

fun main() 
//  将学生类实例化 并且调用它的study方法
    val student = Student("11923020121", 3)
    student.study()

//open 表明类是可以被继承的
open class Person 
    var name = ""
    var age = 0
    fun eat() 
        println("$name is eating. He is $age years old.")
    

//显示的指明学生类的参数
class Student(val sno: String, val grade: Int) : Person() 
    fun study()
        println("grade is  $grade and sno is $sno")
    

运行结果:

如果你想在主构造函数中编写逻辑, 可以使用init结构体,
 所有主函数的逻辑都可以写在里面:

测试代码:

fun main() 
//  将学生类实例化 并且调用它的study方法
    val student = Student("11923020121", 3)
//    student.study()

//open 表明类是可以被继承的
open class Person 
    var name = ""
    var age = 0
    fun eat() 
        println("$name is eating. He is $age years old.")
    

//显示的指明学生类的参数
class Student(val sno: String, val grade: Int) : Person() 
//    init 这里给主构造方法添加了2个打印语句
    init 
        println("sno is $grade")
        println("grade is $grade")
    
    fun study()
        println("grade is  $grade and sno is $sno")
    

运行结果:

子类的构造函数调用父类中的哪一个构造函数,在继承的时候通过括号来指定:
class Student(val sno: String, val grade: Int) : Person() 

在这里, Person类后面的一对空括号表示Student类的主构造函数在初始化
的时候会调用Person类的无参构造函数, 即使在无参的情况下, \\
这对括号也不能省略.

如果我们将Person类改造一下,将姓名和年龄都放在主构造函数中
open class Person(val name:String,val age :Int) 

那么Student类在继承Person类的时候,
就必须给Person类的构造函数传入name和age字段
class Student(val sno:String, val grade:Int, name: String, age: Int) :Person(name, age)
    init 
        println("sno is $sno")
        println("grade is $grade")
        println("name is $name")
        println("age is $age")
    

接下来是完整的代码演示
fun main() 
    val stu= Student("119230",3,"Tom",18)


open class Person(val name:String,val age :Int) 


class Student(val sno:String, val grade:Int, name: String, age: Int) :Person(name, age)
    init 
        println("sno is $sno")
        println("grade is $grade")
        println("name is $name")
        println("age is $age")
    

运行结果:

2.2 次构造函数

任何一个类都只能有一个主构造函数, 但可以有多个次构造函数, 
次构造函数也是用来实例化一个类的, 但它是有自己的函数体的

所有次构造函数都必须调用主构造函数(包括间接调用) .

代码演示:
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) 
    init 
        println("sno is $sno")
        println("grade is $grade")
        println("name is $name")
        println("age is $age")
    

第一个次构造函数:

接受name和age参数, 并且通过this调用了 主构造函数

第二个次构造函数:

空参构造函数

下面用创建一些类的实例
fun main() 
    val stu1 = Student()
    val stu2 = Student("Peter", 19)
    val stu3 = Student("119230", 3, "Tom", 18)



以上是关于Kotlin语言之面向对象编程的主要内容,如果未能解决你的问题,请参考以下文章

kotlin 实战之面向对象特性全方位总结

Kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现

Kotlin——从无到有系列之中级篇:面向对象的特征与类(class)继承详解

Rust编程语言入门之Rust的面向对象编程特性

Kotlin初识Kotlin之面向对象

Python之面向对象