1 类

Kotlin 中使用关键字 class 声明类。类声明由类名、类头(指定其类型参数、主构造函数等)以及由花括号包围的类体构成。类头与类体都是可选的; 如果一个类没有类体,可以省略花括号。

class Car { /*……*/ }

1.1 构造函数

在 Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名与可选的类型参数后。与普通属性一样,主构造函数中声明的参数可以是可变的(var)或只读的(val)。

class Person constructor(firstName: String) { /*……*/ }// 如果主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。
class Person(firstName: String) { /*……*/ }// 如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面
class Person public @Inject constructor(name: String) { /*……*/ }

主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块(initializer blocks)中。在实例初始化期间,初始化块按照它们出现在类体中的顺序执行,与属性初始化器交织在一起:

class Test(name: String) {val firstProperty = "First property: $name".also(::println)init {println("First initializer block that prints $name")}val secondProperty = "Second property: ${name.length}".also(::println)init {println("Second initializer block that prints ${name.length}")}
}fun main() {Test("hello")
}

主构造的参数可以在初始化块中使用。它们也可以在类体内声明的属性初始化器中使用:

class Customer(name: String) {val customerKey = name.uppercase()
}

参数可设置默认值,减少构造函数或者方法的重载 :

class Person(val firstName: String, val lastName: String, var isEmployed: Boolean = true)

声明类属性时,可以使用尾部逗号:

class Person(val firstName: String,val lastName: String,var age: Int, // 尾部逗号
) { /*...*/ }

1.2 次构造函数

类也可以声明前缀有 constructor次构造函数

class Person(val pets: MutableList<Pet> = mutableListOf())class Pet {constructor(owner: Person) {owner.pets.add(this) // adds this pet to the list of its owner's pets}
}

如果类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用 this 关键字即可:

class Person(val name: String) {val children: MutableList<Person> = mutableListOf()constructor(name: String, parent: Person) : this(name) {parent.children.add(this)}
}

请注意,初始化块中的代码实际上会成为主构造函数的一部分。委托给主构造函数会作为次构造函数的第一条语句,因此所有初始化块与属性初始化器中的代码都会在次构造函数体之前执行。

即使该类没有主构造函数,这种委托仍会隐式发生,并且仍会执行初始化块:

//sampleStart
class Constructors {init {println("Init block")}constructor(i: Int) {println("Constructor $i")}
}
//sampleEndfun main() {Constructors(1)
}

如果一个非抽象类没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数。构造函数的可见性是 public。

如果你不希望你的类有一个公有构造函数,那么声明一个带有非默认可见性的空的主构造函数:

class DontCreateMe private constructor() { /*……*/ }

在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数,它将使用默认值。这使得 Kotlin 更易于使用像 Jackson 或者 JPA 这样的通过无参构造函数创建类的实例的库。

class Customer(val customerName: String = "")

1.3 创建类的实例

创建一个类的实例,只需像普通函数一样调用构造函数:

val invoice = Invoice()val customer = Customer("Joe Smith")

创建嵌套类、内部类与匿名内部类的类实例的过程在嵌套类中有述。

1.4 类成员

类可以包含:

  • 构造函数与初始化块
  • 函数
  • 属性
  • 嵌套类与内部类
  • 对象声明

1.5 继承

见后续章节

1.6 抽象类

类以及其中的某些或全部成员可以声明为 abstract。 抽象成员在本类中可以不用实现。 并不需要用 open 标注抽象类或者函数。

abstract class Polygon {abstract fun draw()
}class Rectangle : Polygon() {override fun draw() {// draw the rectangle}
}

可以用一个抽象成员覆盖一个非抽象的开放成员。

open class Polygon {open fun draw() {// some default polygon drawing method}
}abstract class WildShape : Polygon() {// Classes that inherit WildShape need to provide their own// draw method instead of using the default on Polygonabstract override fun draw()
}

1.7 伴生对象

如果你需要写一个可以无需用一个类的实例来调用、但需要访问类内部的函数(例如,工厂方法),你可以把它写成该类内对象声明中的一员。

更具体地讲,如果在你的类内声明了一个伴生对象, 你就可以访问其成员,只是以类名作为限定符。

【Kotlin基础系列】第7章 类与对象(1)--- 类相关推荐

  1. 【JAVA SE】第六章 面向对象、对象和类以及封装

    第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...

  2. java类与对象_Java类与对象

    类与对象 1,面向对象编程简介 Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展.面向过程编程(C语言).函数式编程(Scala).面向对象编程 ...

  3. C++ 类与对象_类的其他成员(常成员,静态成员,友元)

    系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...

  4. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...

  5. 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用

    实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...

  6. c++类和对象(类的概念)

    1.类和对象概念 类:用来对实体(对象)进行描述,对象有什么属性,以及对象具有什么功能是一种自定义类型 对象:现实生活中所存在的 ,对象是对类的具体体现 用类类型创建出来的变量称为对象 2.类的定义 ...

  7. mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...

    这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...

  8. 【Kotlin基础系列】第1章 简介

    1.1 Kotlin简介 Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发.是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐. 它简洁.安全.可与 Java 及 ...

  9. 【Kotlin基础系列】第6章 包与导入

    源文件通常以包声明开头: package org.examplefun printMessage() { /*--*/ } class Message { /*--*/ }// -- 源文件所有内容( ...

最新文章

  1. ICLR 2020| 最新NAS benchmark:0.1秒完成NAS算法搜索
  2. 三分钟学会《门面模式》
  3. SSL连接并非完全问题解决
  4. js input 自动换行_矿用自动灭火装置水基型自动灭火装置原理国内分析研讨_搜狐汽车...
  5. aes子密钥生成c语言_一种基于流密码算法的子密钥生成方法与流程
  6. 程序员必会的核心基础知识:1张导图+10本书
  7. js打乱数字顺序吗_js如何将打乱的一维数组按顺序排列(不用封装好的js方法)?...
  8. python入门指南 许半仙-《猛一相亲指南》TXT全本 百度云网盘下载 by许半仙
  9. mysql中的转换类型数据类型_mysql数据类型转换
  10. Matlab 函数文件简介
  11. 银行业金融机构数据治理指引和DCMM的对比分析
  12. IDEA配置JDK版本
  13. Android 蓝牙设备的查找与连接
  14. 至联云讲解《IPFS凭什么能让全世界投资者疯狂》
  15. 【Nmap的使用方法】
  16. 用python编写一个篮球计分系统_毕业设计(3)基于MicroPython的篮球计时计分器模型的设计与实现...
  17. 干货 |《深入理解Elasticsearch》读书笔记
  18. 爱普生墨仓式打印机故障检查,卡纸,清洗打印头,补充墨水详解(非常实用)
  19. matlab 傅里叶变换
  20. 基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)

热门文章

  1. Tekla钢结构檩条自动标注
  2. Git合并分支操作完整流程
  3. 在Viz 3.x中如何导入Viz 2.8的打包文件.eva
  4. 区块链在公共服务领域的应用案例
  5. 【大前端】华农官网页面
  6. ftp服务器只能上传文件,ftp服务器上传文件不行
  7. 谷歌翻译用不了的解决方案
  8. 追梦算法----P1072. 排队打水
  9. 从业3年45万年薪的AI训练师是如何养成的?
  10. bebian修改菱形乱码