类声明

Kotlin使用class关键字声明类:

class Invoice{

}

Kotlin类声明基本包括header与body:

[<Modifier>] <class> [<Visibility modifiers>]  <className> [<constructor>]
[< body>]

构造器

kotlin的类能有一个主要的构造器与多个次要的构造器。主构造器出现在类名的后面参数是可选的。

class Person constructor(firstName: String){
...
}

如果主构造器没有注解或可见修饰符constructor关键字可以省略:

class Person(firstName: String){
...
}

Kotlin能够使用constructor声明多个次要的构造器:

class Person{
constructor(parent: Person){ } constructor(name: String, parent: Person){ }
}

如果类有一个主构造器其他的构造器都需要去直接或间接的调用它:

class Person(val name: String){
constructor(name: String, parent: Person): this(name){ }
}

创建实例

Kotlin没有new关键字,创建类的实例只需要调用对应的构造方法:

val invoice = Invoice()
val person = Person("xx")

继承

所有的class有一个共同的超类Any如果类声明时没有指定超类默认继承Any:

class Empty  //默认继承Any

继承一个指定的类通过在class header后面添加冒号与父类:

open class Base(p: Int)

class Derived(p: Int): Base(p)  //指定构造器

如果子类有主构造器可以在class header中初始化超类,如果该类没有主构造器由其他的构造器通过super关键字直接或间接始化超类:

open class Base(p: Int)

class Derived: Base{

    constructor(p: Int): super(p){

    }
}

open注解与java中的final相反表示类是否可以被继承,Kotlin中所有的类默认是final

重写成员方法

Kotlin使用open标记成员是否可被重写,override显示说明该成员重写父类方法:

open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}

属性

声明属性语法:

var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]

除了初始化和getter/setter是可选的以外属性类型如果能够推断出的话也可以省略。只读属性的声明

语法与可读属性声明只有两个差别:使用val替换var、没有setter。

Kotlin中的类声明可变的(var)属性与只读(val)属性:

class Person{
public var name: String = ""
public val IdCard: String = "xxx" }

通过属性名称使用类中的属性,类似Java中的Field:

fun out(p: Person){

    println("name: ${p.name}")
println("id: ${p.id}")
}

getter/setter:

    public var name: String
get() = "undefined"
set(value) { }

如果只需要重新定义getter/setter的可见性或注解它们但不需要去更改它们行为可以只定义getter/setter不需要定义主体:

    public var name: String = ""
get() = "undefined"
private @Inject set

Kotlin中不能有field,但是在自定义getter/setter的时候可能需要去直接访问属性而不是通过getter/settter。Kotlin自动提供

一个备用字段(field),通过它使用使用属性标识符来访问它。

    public var fieldProp = ""
get() = field
set(value) {
field = value;
}

编译时常量

如果属性能在编译时就已经确定它的值可以使用const关键字声明一个编译时常量但它需要满足以下要求:

  1. 只要出现在最顶层或对象内部
  2. 只支持String与原始类型
  3. 无法算自定义getter
const val COMPILE_CONSTANT = ""



《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。

Kotlin学习系列(三)的更多相关文章

  1. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  2. scrapy爬虫学习系列三:scrapy部署到scrapyhub上

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  3. DocX开源WORD操作组件的学习系列三

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  4. RabbitMQ学习系列三-C#代码接收处理消息

    RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...

  5. .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

    原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能         接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...

  6. Identity Server4学习系列三

    1.简介 在Identity Server4学习系列一和Identity Server4学习系列二之令牌(Token)的概念的基础上,了解了Identity Server4的由来,以及令牌的相关知识, ...

  7. RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理

    上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...

  8. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  9. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】

    http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...

随机推荐

  1. Codeforces 255C

    题意略. 本题考查动态规划,顺便考查一下优化. 这个题目可以归约到最长递增子序列那一类,定义状态:dp[i][j] --- 当前以第i个数结尾,前一个数是第j个数的最长序列. if(a[i] == a ...

  2. JVM知识点总结

    JVM总体梳理 一.jvm体系总体概览 JVM体系总体分四大块:类的加载机制.jvm内存结构.GC算法 垃圾回收.GC分析 命令调优 这里画了一个思维导图,将所有的知识点进行了陈列,因为图比较大可以点 ...

  3. Java线程之线程简介

    Java线程之线程简介 一.何谓线程 明为跟踪处理流程,实为跟踪线程 阅读程序时,我们会按处理流程来阅读. 首先执行这条语句 ↓ 然后执行这条语句 ↓ 接着再执行这条语句…… 我们就是按照上面这样的流 ...

  4. hive 四种表,分区表,内部,外部表,桶表

    Hive四大表类型内部表.外部表.分区表和桶表 一.概述 总体上Hive有四种表:外部表,内部表(管理表),分区表,桶表.分别对应不同的需求.下面主要讲解各种表的适用情形.创建和加载数据方法. 二.具 ...

  5. git@github.com: Permission denied (publickey)

    1.  检查SSH key是否已经存在,如存在走第3步 :      ls ~/.ssh/ 2.  如果第1步中的SSH key不存在,生成一个新的SSH key:      ssh-keygen - ...

  6. hdu-6621 K-th Closest Distance

    题目链接 K-th Closest Distance Problem Description You have an array: a1, a2, , an and you must answer ...

  7. Java内部类的使用小结 形参为什么要用final

    部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文 ...

  8. 【Ehcache】基础知识学习

    一.Ehcache概述 1.1 简介 1.2 Ehcache的主要特性 二.Ehcache使用介绍 2.1 Ehcache缓存过期策略 2.2 如何解决缓存与db不同步的问题. 三.Ehcache 基 ...

  9. 网页去重之Simhash算法

    Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么?   网页去重,顾名思 ...

  10. 让Jenkins执行GitHub上的pipeline脚本

    本文是<Jenkins流水线(pipeline)实战>系列的第二篇,上一篇搭建好了Jenkins环境并执行了一个简单的pipeline任务,当时我们直接在Jenkins网页上编写pipel ...