Kotlin类和对象

来源于:菜鸟教程

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,我们使用this@label,其中@label是一个代指this来源的标签。

匿名内部类

使用对象表达式来创建匿名内部类:

类的修饰符

类的修饰符包括classModifier 和 _accessModifier:

*classModifier:类属性修饰符,标示类本身特性。

accessModifier:访问权限修饰符

原文地址:https://www.cnblogs.com/djxf/p/10133207.html