Kotlin构造函数

Kotlin 复制代码
class Person {
    var name: String? = null
    var age: Int? = null
    fun think() {
        println("Mr./Ms.$name, who is $age years old, is thinking!")
    }
}

fun main () {
    val p = Person()
    p.name = "Jimmy"
    p.age = 20
    p.think()
}

在Kotlin中任意一个非抽象类都无法被继承(一个类允许被继承的话,其无法预知子类会如何实现,便存在一些未知风险)

Kotlin中类的主构造函数默认为无参且不存在函数体;但能够显式地为其指定参数,另外还可以借助init结构体为主构造函数实现逻辑

在主构造函数中用关键字val或var进行声明变量将自动被添加为该类的字段,在为子类的主构造函数添加变量时要尤其注意,避免与父类字段造成冲突

Kotlin 复制代码
open class Person {
    var name: String? = null
    var age: Int? = null
    fun think() {
        println("Mr./Ms.$name, who is $age years old, is thinking!")
    }
}

//显式地为Student类的主构造函数指定参数,并用init结构体为其实现逻辑
//Person后面的空括号表示Student类在继承Person类时,调用其无参构造函数
class Student(var sno: String?, var grade: Int?) : Person() {
     init {
        println("The sno is $sno")
        println("The garde is $grade")
    }
}

/*
open class Person(val name: String, val age: Int) {
    ......
}

class Student(name: String, age: Int, val sno: String, val grade: String) : Person(name, age) {
    ......
}
*/

在Kotlin中,任何一个类只能有一个主构造函数,但可以有多个次构造函数;当一个类既有主构造函数又有次构造函数时,所有次构造函数必须调用主构造函数(包括间接调用),此构造函数通过关键字constructor定义

Kotlin 复制代码
class Student(name: String, age: Int, val sno: String, val grade: Int) : Person(name, age) {
    constructor(name: String, age: Int) : this(name, age, "12345", 1) {
    }
    constructor() : this("小张", 21) {
    }
}

/*解释:这里定义了两个次构造函数:第一个次构造函数接收name和age参数,
并通过this关键字调用主构造函数;
第二个次构造函数无参,其通过this关键字调用第一个次构造函数。
尽管在这里第二个次构造函数只间接调用了主构造函数,但其依然合理*/

同时,Kotlin允许类只有次构造函数(没有主构造函数);当一个类没显式地定义主构造函数且定义了次构造函数时,这个类就是没有主构造函数的

Kotlin 复制代码
class Student : Person {
    constructor(name: String, age: Int) : super(name, age) {
    }
}

/*解释:因为这里Student类没有主构造函数,因而在继承Person类时无需加括号
同时,因为没有主构造函数,次构造函数只能调用父类的构造函数,
因而不能用this关键字,而要换成super关键字*/
相关推荐
程序员雪球2 分钟前
本地IDEA打断点debug容器
java·开发语言
老白干16 分钟前
基于枚举 + 注解的 Java 数据脱敏实践(fastjson 序列化场景)
java·开发语言
半亩码田26 分钟前
C#转Python第4.1篇:当 try-catch 遇上 try-except:异常处理的大不同
开发语言·python·c#
数据知道27 分钟前
Java 安全审计实战:SSRF、反序列化、SpEL 注入
java·开发语言·安全·网络安全
陈年老古董28 分钟前
矿物分类数据处理:缺失值填充方法详解
开发语言·python·机器学习·项目
whcyhhh1 小时前
头歌实践教学平台:数据科学与大数据技术导论(十八4)
大数据·开发语言·python
z落落1 小时前
C# Modbus-RTU 串口读写设备+CRC16+邮件告警
开发语言·c#
DS随心转小程序1 小时前
Gemini只能导出了一部分Word文档,很少的一部分,不是我这个窗口所有的对话内容?
开发语言·人工智能·c#·word·豆包·deepseek·ai导出鸭
江畔柳前堤1 小时前
消息队列:从直觉到精通的完整认知地图
开发语言·人工智能·算法·机器学习·ruby on rails·scala
格林威2 小时前
C# 相机图像配合频闪光源:实现高速稳定拍摄的几个方法
开发语言·网络·人工智能·数码相机·计算机视觉·c#·视觉检测