Kotlin学习系列(三)
类声明
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关键字声明一个编译时常量但它需要满足以下要求:
- 只要出现在最顶层或对象内部
- 只支持
String与原始类型 - 无法算自定义getter
const val COMPILE_CONSTANT = ""
《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。
Kotlin学习系列(三)的更多相关文章
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列三
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能 接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...
- Identity Server4学习系列三
1.简介 在Identity Server4学习系列一和Identity Server4学习系列二之令牌(Token)的概念的基础上,了解了Identity Server4的由来,以及令牌的相关知识, ...
- RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...
- C# Redis学习系列三:Redis配置主从
Redis配置主从 主IP :端口 192.168.0.103 6666 从IP:端口 192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...
- WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】
http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...
随机推荐
- Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】
Json 简介 Json (JavaScript Object Notation) 是一种轻量级的数据交换格式.它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastj ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- fiddler的安装与使用(二)使用fiddler捕获会话信息
前章回顾: 上一遍文章我们已经安装好了fiddler,并解了fiddler的工作原理,接下来开始使用fiddler捕获浏览器会话信息. fiddler基本界面: 首先启动fiddler,然后打开浏览器 ...
- Elasticsearch和solr之我为什么选择solr
老大:这个项目需要用到搜索引擎,小李你去学习一下. 小李:喳! 小李:以前用过的搜索引擎是solr4.7,那已经是两年前使用的了不知道现在有没有更好的解决方案了呢? 小李打开了google,百度,bi ...
- STL 中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: nam ...
- Prim && Kruskal
Electrification Plan Prim #include<iostream> #include<cstring> using namespace std; cons ...
- 中南林业科技大学第十一届程序设计大赛 有趣的二进制 牛客网 java大数的一些方法
链接:https://www.nowcoder.com/acm/contest/124/C来源:牛客网 题目描述 小新在学C语言的时候,邝老师告诉他double类型的数据在表示小数的时候,小数点后的有 ...
- 使用Git初始化本地仓库并首次提交代码
本文介绍使用Git初始化本地仓库,并首次提交代码到远程仓库GitLab上面. 首先,登录GitLab,创建一个新项目的私人仓库: 然后,在本地仓库(就是你写代码文件夹),右键,Git Bash Her ...
- abp(net core)+easyui+efcore实现仓储管理系统——菜单-下(十七)
实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案 ...
- Java连载30-方法重载、方法递归
一.方法重载 1.又被称为overload 2.方法重载使用场景 功能类似的时候,尽可能仍方法名相同(但是功能不同或者不相似的时候,方法名尽量不同) 3.什么条件满足之后,可以构成方法重载 (1)在同 ...