当前位置: 首页 > news >正文

Kotlin面向对象编程之构造函数

class Person {var name: String? = nullvar age: Int? = nullfun think() {println("Mr./Ms.$name, who is $age years old, is thinking!")}
}fun main () {val p = Person()p.name = "Jimmy"p.age = 20p.think()
}

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

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

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

open class Person {var name: String? = nullvar age: Int? = nullfun 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定义

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允许类只有次构造函数(没有主构造函数);当一个类没显式地定义主构造函数且定义了次构造函数时,这个类就是没有主构造函数的

class Student : Person {constructor(name: String, age: Int) : super(name, age) {}
}/*解释:因为这里Student类没有主构造函数,因而在继承Person类时无需加括号
同时,因为没有主构造函数,次构造函数只能调用父类的构造函数,
因而不能用this关键字,而要换成super关键字*/


http://www.mrgr.cn/news/83666.html

相关文章:

  • 01、kafka知识点综合
  • 【Vue】Vue 拖拽指令 禁选文字 解决子元素 input 不能输入 、拖动粘连鼠标
  • 在 .NET 9 中使用 Scalar 替代 Swagger
  • webrtc之rtc::ArrayView<const uint8_t>
  • 万物互联的背后:MCU嵌入式硬件的奇幻之旅
  • 《OpenCV计算机视觉实战项目》——银行卡号识别
  • 【Flink】Flink内存管理
  • Redis持久化双雄
  • 免费获取2025新年跨年春节春晚烟花祝福html+js源码
  • WebGL性能检测
  • 用python实战excel和word自动化
  • halcon三维点云数据处理(十)locate_cylinder_3d
  • Pycharm 使用教程
  • 第 25 场 蓝桥入门赛
  • 简单组合逻辑
  • 计算机数据提取与固定
  • sparkRDD教程之基本命令
  • linux软件框架中间件选择(GDbus与FDbus)
  • python基础语法(1) ------- 学习笔记分享
  • vue城市道路交通流量预测可视化系统
  • shell脚本第一次作业
  • 1/13C++
  • 127.【C语言】补充:函数的三种调用约定
  • SpringBoot:使用HTTP2+protobuf实现高性能微服务调用
  • 【Linux】Linux开发:GDB调试器与Git版本控制工具指南
  • JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)