Kotlin语法(类和对象)
二、类和对象:
1. 类定义:
类的声明包含类名,类头(指定类型参数,主构造函数等等),以及类主体,用大括号包裹。类头和类体是可选的;如果没有类体可以省略大括号。
class Invoice{
}
2. 构造函数:
在 Kotlin 中类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的参数)。
class Person(val firstName: String, val lastName: String, var age: Int){
}
初始化代码可以放在以 init 做前缀的初始化块内:
class Customer(name: String){
init {
logger,info("Customer initialized with value ${name}")
}
}
如果构造函数有注解或可见性声明,则 constructor 关键字是不可少的,并且注解应该在前:
class Customer public inject constructor (name: String) {...}
3. 二级构造函数:
前缀是 constructor:
class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}
如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) {
constructor (name: String, paret: Person) : this(name) {
parent.children.add(this)
}
}
没有声明构造函数,则有一个默认的无参构造函数。
4. 创建类的实例:
val invoice = Invoice()
val customer = Customer("Joe Smith")
5. 继承
所有类的基类:Any,类似Java中的Object
所有非抽象类默认都是不可继承的(java中的final),如果要被子类继承,需要使用open关键字(与java中的final功能相反),继承用:操作符。
open class Base(p: Ont)
class Derived(p: Int) : Base(p)
方法如果要被重写,则也需要是open的,不想被重写就加final
open class AnotherDerived() : Base() {
final override fun v() {}
}
方法重写规则:如果有多个相同的方法(继承或者实现自其他类,如A、B类),则必须要重写该方法,使用super范型去选择性地调用父类的实现。
open class A {
open fun f () { print("A") }
fun a() { print("a") }
}
interface B {
fun f() { print("B") } //接口的成员变量默认是 open 的
fun b() { print("b") }
}
class C() : A() , B{
override fun f() {
super<A>.f()//调用 A.f()
super<B>.f()//调用 B.f()
}
}
6. 抽象类
abstract关键字,抽象类和函数默认是open的。
open class Base {
open fun f() {}
}
abstract class Derived : Base() {
override abstract fun f()
}
7. 伴随对象
使用伴随对象可以直接使用类名来访问(用法类似Java中的static,但是不一样):
class MyClass {
companion object {
var BASE_URL: String = "BASE_URL";
}
}
println("BASE_URL: " + MyClass.BASE_URL)
与java的static不同,运行时它们仍然是真正对象的成员实例,比如可以实现接口:
inerface Factory<T> {
fun create(): T
}
class MyClass {
companion object : Factory<MyClass> {
override fun create(): MyClass = MyClass()
}
}
8. Getter 和 Setter 函数
一般定义变量的时候有默认的getter/setter方法;如果使用$访问,则可以避开getter/setter方法。
var stringRepresentation: String
get() = this.toString()
set (value) {
setDataFormString(value)
}
改变一个访问者的可见性或者注解它,可以不用改变默认的实现:
var settVisibilite: String = "abc"//非空类型必须初始化
private set // setter 是私有的并且有默认的实现
var setterVithAnnotation: Any?
@Inject set // 用 Inject 注解 setter
9. 接口
可以包含抽象方法,以及方法的默认实现。可以有属性但必须是抽象的。一个类或对象可以实现一个或多个接口。
interface MyInterface {
fun bar()
fun foo() {
//函数体是可选的
}
}
接口属性不能赋值,需要被子类override:
interface MyInterface {
val property: Int //抽象属性
fun foo() {
println(property)
}
}
class Child : MyInterface {
override val property: Int = 29
}
输出:29
10. 可见性修饰词
- private: 只在该类(以及它的成员)中可见
- protected: 和 private 一样但在子类中也可见
- internal: 在本模块的所有可以访问该类的均可以访问该类的所有 internal 成员
- public: 任何地方可见
11. 数据类
使用data关键词修饰类,则会自动添加equals()/hashCode, toString, [compontN()functions]对应按声明顺序出现的所有属性, copy()
data class User(val name: String, val age: Int)
组件函数允许数据类在多重声明中使用:
val jane = User("jane", 35)
val (name, age) = jane
println("$name, $age years of age")
12. 内部类
类可以标记为 inner 这样就可以访问外部类的成员。内部类拥有外部类的一个对象引用:
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo()
13. 对象表达式
类似Java的匿名内部类,可以继承/实现多个:
var zhangsan = object : Person(), MyInterface{
override val property: Int = 512
override fun toString(): String {
return "toString() modified"
}
}
println(zhangsan.toString())
一个没有父类的对象,我们可以这样写:
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
14. 代理
类代理:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { printz(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print()
}
属性代理:
class Example {
var p: String by Delegate()
}
class Delegate {
fun get(thisRef: Any?, prop: PropertyMetadata): String {
return "$thisRef, thank you for delegating '${prop.name}' to me !"
}
fun set(thisRef: Any?, prop: PropertyMatada, value: String) {
println("$value has been assigned to '${prop.name} in $thisRef.'")
}
}
val e = Example()
pintln(e.p)
输出:Example@33a17727, thank you for delegating ‘p’ to me!
参考:
- http://kotlinlang.org/docs/reference/basic-syntax.html
- http://huanglizhuo.gitbooks.io/kotlin-in-chinese
Kotlin语法(类和对象)的更多相关文章
- Kotlin基础(三)类、对象和接口
类.对象和接口 一.定义类的继承结构 一)Kotlin中的接口 Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态. interface Cl ...
- PHP7语法知识(三):时间与日期、表单、类与对象、正则表达式、错误异常处理、图像处理
时间与日期 一.设置时区 1.在配置文件中设置: 2.通过data_default_timezone_set函数在文件中设置: 二.获取当前时间 三.常用时间处理方法 1.格式化时间显示: 2.计算时 ...
- flutter--Dart基础语法(三)类和对象、泛型、库
一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源.免费,拥有宽松的开源协议,支持移动.Web.桌面和嵌入式平台. ...
- JAVA基础语法:函数(方法)、类和对象(转载)
4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...
- python类与对象基本语法
面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...
- 五分钟学会 Kotlin 语法
为什么使用Kotlin 项目一期在收尾了终于有时间折腾了,一个多月以来Kotlin从入门到现在,坚持用来开发的切身感受.因为语法与Java的区别挺大的一开始很想放弃,如果不是因为项目在使用,想必很少人 ...
- C++基础知识(5)---类和对象
终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...
- [Java入门笔记] 面向对象编程基础(一):类和对象
什么是面向对象编程? 我们先来看看几个概念: 面向过程程序设计 面向过程,是根据事情发展的步骤,按进行的顺序过程划分,面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实 ...
- 02OC的类和对象
这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#.Java等没有那么多的语法特性,所以差别还是比较大的. 一 ...
随机推荐
- oracle表数据类型number对应java中BIgDecimal转int
oracle中id为number类型,在java获取id时用getBigDecimal 相匹配, 如果想转换成int,重写model中的getInt方法: public Integer getInt( ...
- [Logstash-input-redis] 使用详解
redis插件的完整配置 input { redis { batch_count => 1 #返回的事件数量,此属性仅在list模式下起作用. data_type => "lis ...
- js文件合并,压缩,缓存,延迟加载
做web前段也有一段时间了,对于web中js文件的加载有些体会想跟大家一起分享一下. 1.首先说说js文件的合并和压缩吧 为了便于集中式管理js的合并和压缩我们创建一个Js.ashx文件来专门处理合并 ...
- Laravel5做权限管理
关于权限管理的思考 最近用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认证部分非常好做,就是管理员登录,记录session.这个laravel中也 ...
- Zip 压缩、解压技术在 HTML5 浏览器中的应用
JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...
- jquery 进阶
1.0 jquery的ajax同步和异步区别 2.0 cdnjquery加载失败加载本地 <script type="text/javascript" src="/ ...
- .Net实现拉勾网爬虫
前几天看到一个.NET Core写成的爬虫,有些莫名的小兴奋,之前一直用集搜客去爬拉勾网的招聘信息,这个傻瓜化工具相当于用HTML模板页去标记DOM节点,然后在浏览器窗口上模拟人的浏览行为同时跟踪节点 ...
- HoverTree系统源码介绍
HoverTree是一个开源asp.net系统.系统的效果请到:http://hovertree.com体验. 源码描述:一.源码特点采用典型的三层架构进行开发,实现了留言板的功能,后台管理,留言审核 ...
- SQL Server存储过程多角度介绍
什么是存储过程: 存储过程(Procedure)类似于C#语言中的方法,它是SQL语句和控制流语句的预编译集合.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.逻辑控制语句 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...