kotlin语言中的继承与构造函数(详解)(代码片段)

yzk134144 yzk134144     2023-01-03     320

关键词:

        学习kotlin时,有很多小伙伴无法理解为何有的继承结构父类后面需要加括号,有时候却不用加括号,本篇文章小编将为你们解除这个困惑!顺便为大家详解一下kotlin中的主构造函数和次构造函数。
    首先我们先来了解一下kotlin中的继承:    

        比如我们现在要定义一个Student类,每个学生都有自己的学号和年级,我们在Student类中加入sno和grade字段,同时每个学生又都是人,有自己的年龄和名字而且都会睡觉,如果在Student类中重复定义age和name字段还有sleep()函数的话就显得过于冗余,这时我们就可以让Student类去继承Person类,这样就拥有了Person类中的字段和函数了。
    那么kotlin中如何让Student类继承Person类呢,我们分为两个步骤,首先让Person类可以被继承,第二步就是让Student类继承于Person类。
    这里我们就看到kotlin与java的不同了,在kotlin中,任何一个非抽象类都是默认不可被继承的,相当于java中声明了final关键字。
    接下来我们就让Person类能够被继承,很简单,只需要在类前加入open关键字就好了。如下所示:

open class Person
		...

        第二步就是让Student类继承于Person类,不同于java的extends关键字,kotlin中继承使用的时冒号。写法如下:

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

        这里就出现了我们刚开始提到的,Person类后面我们加入了一个括号,这里就涉及到了一个规定,子类中的构造函数必须调用父类中的构造函数,这里的括号就是代表Student类(子类)的主构造函数调用Person类(父类)的无参构造函数,每个类默认都有一个不带参数的主构造函数,当然也有特殊情况,当一个类没有显式地定义主构造函数且定义了次构造函数时,那么这个类就是没有主构造函数。(这里我们在文章后面还会再提到)接下来我们就来详细介绍一下kotlin中的主构造函数和次构造函数。

        我们说到每个类都会默认有一个不带参数的主构造函数,当然可以显式地给它指明参数,,主构造函数的特点就是没有函数体,直接定义在类名的后面即可,写法如下:

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

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

val student = Student("zk123",6)

        既然主构造函数没有函数体,如果我想在主构造函数中编写一些逻辑怎么办呢?当然有办法,kotlin提供了一个init结构体,所有主构造函数中的逻辑都可以写在里面,写法如下:

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

        这里简单打印了一下学号和年级的值。

        我们改造一下Person类:

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

        那么子类Student类的主构造函数调用父类Person类的构造函数就可以这样写:

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

        注意Student类的构造函数中加入的name和age字段不再声明为val或var,假设声明了val或var会自动成为该类的字段,会导致和父类中的name和age字段发生冲突。接下来创建实例就可以这样写:

val student = Student("zk123",6,"Tom",20)

接下来我们来了解一下次构造函数:

        任何一个类只能有一个主构造函数,但可以有多个次构造函数,次构造函数也可以用于实例化一个类,且次构造函数是有函数体的。

        次构造函数是通过constructor关键字来定义的。

        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)
    

        这里我们定义了两个次构造函数,第一个次构造函数接收name和age两个字段,并通过this关键字调用了主构造函数;第二个构造函数不接收任何参数,通过this关键字调用了我们定义的第一个次构造函数,由于第一个次构造函数调用了主构造函数,所以第二个次构造函数等于间接调用了主构造函数,所以也是合法的。

        接下来我们创建实例就可以通过次构造函数进行创建,写法如下:

val firstStudent = Student("Dick",20)
val secondStudent = Student()

        接下来我们回到上面说到的特殊情况,当一个类没有显式地定义主构造函数且定义了次构造函数时,那么这个类就是没有主构造函数。那既然这个类没有了主构造函数,那这时次构造函数肯定没办法调用主构造函数,此时就得调用父类的构造函数,写法如下:

class Student : Person
    constructor(name : String,age : Int) : super(name,age)
    

        细心的同学会发现,这里的Person类后面没有了括号,因为此时的Student没有主构造函数,所以不需要调用在主构造函数中调用Person类的构造函数,即不需要再加括号。

        希望这些对大家能有帮助,有不足欢迎大家补充,本篇也是参考郭神的文献,自己梳理一遍方便复习。

kotlin类与继承(代码片段)

类kotlin中使用关键字class声明类类声明由类名,类头(指定其类型参数,主构造函数等),花括号包围的类体构成,类头和类体都是可选的。classStudent如果一个类没有类体,则可以省略花括号classEmpty主... 查看详情

kotlin学习之类与对象继承与构造函数(代码片段)

类与对象首先创建一个Person类。右击包→New→KotlinFile/Class,在弹出的对话框中输入“Person”。对话框在默认情况下自动选中的是创建一个File,File通常是用于编写Kotlin顶层函数和扩展函数的,我们可以点击展开下拉列... 查看详情

kotlin学习之路:继承(代码片段)

...承二.继承中的构造函数2.1继承中Java的构造函数2.2继承中Kotlin的构造函数2.3Kotlin多个构造函数的情况三.重写和重载3.1方法的重写3.2属性的重写四.super关键字4.1简单用法4.2复杂情况下的用法4.2.1子类重写方法中使用super4.2.2子类选择... 查看详情

kotlin小悟-这个继承有点不一样(代码片段)

今天聊聊kotlin中关于构造函数的一个话题。我们知道,在kotlin中构造函数分为主构造函数和从构造函数,关于详细的内容,可以点击下面的文章链接了解。Kotlin系列之主构造方法和初始化语句块Kotlin系列之从构造方法... 查看详情

第46课继承中的构造与析构(代码片段)

...化2、调用父类构造函数进行初始化父类构造函数在子类中的调用方式: 显式调用只能在初始化列表进行。如下:  示例程序:第30行会调用子类的无参构造函数Child(),而这个构造函数会默认 查看详情

kotlin小悟-这个继承有点不一样(代码片段)

今天聊聊kotlin中关于构造函数的一个话题。我们知道,在kotlin中构造函数分为主构造函数和从构造函数,关于详细的内容,可以点击下面的文章链接了解。Kotlin系列之主构造方法和初始化语句块Kotlin系列之从构造方法... 查看详情

js中的继承详解(代码片段)

...承等等。接下来我们就详细的介绍一下这几种方式。1.js中的原型继承关于原型继承的内容其实在上一篇博客中已经介绍过,这里就只说一下它的实现方式,关于其他的内容就不过多重复了。在js中实现原型继承的方式是... 查看详情

继承中的构造与析构(代码片段)

调用Child午餐构造函数,Child继承自Parent,创建对象c时,会调用父类无参构造函数,而父类没有无参构造函数,所以报错:noParentconstructortocall:#include<iostream>#include<string>usingnamespace 查看详情

android学习之《第一行代码》第三版笔记kotlin继承时的括号到底写不写(代码片段)

内容学习来源:第2章探究新语言,快速入门Kotlin编程目录一、问题来源二、继承与构造函数(一)前置知识(二)括号代表了什么(三)继承时,什么时候不要加括号1.子类的括号不用写:... 查看详情

kotlin基础之变量与函数详解(代码片段)

...量和函数就是编程语言之本。那么本节我们就来学习一下Kotlin中变量和函数的用法。1.变量先来学习变量。在Kotlin中定义变量的方式和Java区别很大,在Java中如果想要定义一个变量,需要在变量前面声明这个变量的类型... 查看详情

c++类的继承三(继承中的构造与析构)

//继承中的构造与析构#include<iostream>usingnamespacestd;/*继承中的构造析构调用原则1.子类对象在创建时会首先调用父类的构造函数2.父类构造函数执行结束后,执行子类的构造函数3.当父类的构造函数有参数时,需要在子类的初... 查看详情

kotlin与java的异同(代码片段)

本文章只为了方便查阅。文章目录1.局部函数和扩展2.定义类继承结构接口open,final和abstract修饰符:默认为finalopenabstract可见性修饰符:默认为public内部类和嵌套类:默认是嵌套类密封类:定义受限的类继承结构3.... 查看详情

c++多态详解(代码片段)

...表底层原理静态绑定和动态绑定小结单继承和多继承关系中的虚函数表单继承中的虚函数表多继承中的虚函数表概念多态,即多种形态&# 查看详情

kotlin数据类与密封类(代码片段)

/***主构造函数至少包含一个参数*所有的主构造函数的参数必须标识为val或者var*数据类不可以声明为abstractopen、sealed或者inner*数据类不能继承其他类,但是可以实现接口*///关键字为datadataclassUser(valname:String,valage:Int)//funcopy(name:Str... 查看详情

kotlin的构造函数看这一篇就够了(代码片段)

在kotlin中,一个标准的继承写法是这样的classAA:BB(),你想过没有,为什么AA后面没有括号,而BB后面有呢?Kotlin和Java中有这样两个特性:1.子类继承父类时,需要在构造函数中调用父类的构造函数2.如果... 查看详情

kotlin::双冒号操作符详解(获取类的引用|获取对象类型的引用|获取函数的引用|获取属性的引用|java中的class与kotlin中的kclass)(代码片段)

...3、获取函数的引用4、获取属性的引用二、java.lang.Class与kotlin.reflect.KClass一、::双冒号操作符在Kotlin中,::双冒号操作符的作用是获取类,对象,函数,属性的类型对象引用;获取的这些引用,并不常用,都是在Kotlin反射操作时才会用到;相... 查看详情

5.javascript原型链和继承详解(代码片段)

JavaScript原型链和继承详解上一篇JavaScript作用域和闭包详细总结下一篇JavaScript浅层克隆和深层克隆文章目录JavaScript原型链和继承详解一、原型二、原型链原型链图解了解this与call/apply方法三、继承一、原型1.定义:原型是funct... 查看详情

[c/c++]详解c++中的继承(代码片段)

...开始,介绍了基类和派生类对象赋值转换,继承中的作用域,派生类的默认成员函数,继承与友元的关系,继承与静态成员的关系,复杂的菱形继承及菱形虚拟继承。目录一、继承的概念1.概念2.继承定义... 查看详情