来源于:菜鸟教程
Kotlin类可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明。
Kotlin中使用关键字class声明类,后面紧跟类名:
class Runoob { //类似Java
}
但是Kotlin可以定义一个空类:
class Empty
类中定义成员函数:
class Runoob() { fun foo() { print("Foo")} //成员函数 }
类的属性
属性定义
类的属性可以用关键字var声明为可变的,否则使用关键字val 声明为不可变。
class Runoob {
var name :String = "斗酒相逢"
var url :String = "www.djxf.github.io"
val city : String = "株洲"
}
我们可以使用普通函数那样使用构造函数创建类实例:
val site = Runoob() //注意的是kotlin中没有new关键字
要使用一个属性,只要用名称引用它即可。
site.name //使用.号来引用
site.url
Kotlin中的类中可以有一个主构造器,以及一个或多个构造器,主构造器是类头部的一部分,位于类名称之后:
class Person construtor(firstName : String)
{}
如果主构造器没有任何注解,也没有任何可见度修饰符,那么constructor关键字可以省略。
class Person(firstName : String){}
getter 和 setter
如果属性类型可以从初始化语句或者类的成员函数中推断出来,那就可以省去类型,val不允许设置setter函数,因为它只是可读的。
实例:
Kotlin中类不能有字段。提供了Backing Fields(后端变量)机制,备用字段使用field关键字声明,field关键字只能用于属性的访问器,如以上实例。
非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟化的方案,使用lateinit关键字属性:
lateinit var subject : TestSubject
主构造器
主构造器中不能包含任何代码,初始化代码可放在初始化代码段中,初始化代码段使用init关键字init作为前缀。
class Person constructor(fisrtName : String) { init { println("FirstName is $firstName") } }
注意:主构造器的参数可以在初始化代码段中使用,也可以在类主体n定义的属性初始化代码中使用。一种简洁语法,可以通过主构造器来定义属性并初始化属性值(可以是var或val):
class People (val firstName : String, val lastName : String){ //... }
如果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前。
实例:
次构造函数
类也可以有二级构造函数,需要加前缀constructor.
如果类有主构造函数,每个次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this关键字:
如果一个非抽象类没有声明构造函数(主或次构造函数),它会产生一个没有参数的构造函数。构造函数是public。如果你不想你的类有公共的构造函数,你就得声明一个空的主构造函数:
class DontCreateMe private constructor(){ }
注意:在JVM虚拟机中,如果主构造函数的所有参数都有默认值,编译器会生成一个附加的无参的构造函数,这个构造函数会直接使用默认值。这使得Kotlin可以使用更简单的使用像Jackson或者JPA这样使用无参构造函数来创建类实例的库。
class Customer (val customerName : String = "")
实例:
抽象类
抽象是面向对象的特征之一,类本身,或类中的部分成员,都可以声明abstract的。抽象成员在类中不存在具体的实现。
注意:无需对抽象类或抽象成员标注open注解。
嵌套类
我们可以把类嵌套在其他类中,看一下实例:
内部类
内部类使用inner关键字来表示。
内部类会有一个对外部类的对象的引用,所有内部类可以访问外部类成员属性和成员函数。
为了消除歧义,要访问外部作用域的this,我们使用[email protected],其中@label是一个代指this来源的标签。
匿名内部类
使用对象表达式来创建匿名内部类:
类的修饰符
类的修饰符包括classModifier 和 _accessModifier:
*classModifier:类属性修饰符,标示类本身特性。
accessModifier:访问权限修饰符
原文地址:https://www.cnblogs.com/djxf/p/10133207.html