kotlin 类

在 Kotlin 中所有类都有一个共同的超类 Any.

1.类关键字

1.kotlin 类使用关键字class

class  Animi{
}

2.kotlin 的类默认是final的,如果这个类允许被继承,必须使用open关键字修饰类。

open class Animi{
}

2.kotlin 的构造函数:

kotlin的构造函数包含主构造函数和次构造函数。

Tips:

  1. 主构造函数最多只能有一个,也可以没有,默认会有一个无参的。
  2. 次构造函数可以有一个或多个或0个。
  3. 主构造函数中不能有任何代码,初始化可以在初始化块中,初始化块是主构造函数的一部分。
  4. 如果类有主构造函数,则所有的次构造函数都要委托于主构造函数。可以直接委托给主构造函数,也可以间接的通过其他次构造函数委托给主构造函数。
  5. 委托到同一个类的另一个构造函数用 this 关键字即可

构造函数的关键字:constructor
主构造函数跟在类名的后面:

class   Test //无类体,省略{}
class   Test(){} //显示,默认无参构造
class   Test {} //隐式,默认无参构造
class   Test constructor(str : String){}   //显示主构造函数写法
class   Test(str : String){}  //省略constructor关键字,主构造函数的隐式写法
class   Test  private  constructor(str : String,abs : Int){}   //含有修饰符不能使用隐式写法
class   Test  @inject  private  constructor(str : String,abs : Int){} //含有注解修饰符不能使用隐式写法

类体中可以再添加次构造函数:

Tips:

  1. 默认构造函数的可见性是public的,但是你可以修改其可见性;
  2. 非抽象类,如果没有显示的声明构造函数,默认会生成一个无参构造函数。
  3. 在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成 一个额外的无参构造函数,它将使用默认值。
  4. 带有修饰符/注解的主构造函数,需要使用constructor关键字。

1.当类只有一个构造函数时,使用init完成构造函数。主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字。

class  Animi(i : Int , type : String){

       init{
                  abs(i , type)
            }


       fun  abs(count : Int , type : String){
              var co=count;
              val  tt = type
        }
}

2.当有多个不同的构造函数,但是没有主构造函数时,使用construction关键字

class Fruit {

    constructor(name: String, leve: String) {}

    constructor(name: String, leve: String, number: Int) : this(name, leve) {}
}

3.当类有主构造函数时,所有的次构造函数都必须要,使用this关键字,直接或间接委托主构造函数。

class Fruit(name: String) { //主构造函数

    constructor(name: String, leve: String) : this(name) {// 次构造函数1    }

    constructor(name: String, leve: String, number: Int) : this(name, leve) {// 次构造函数2    }

}

4.带默认值的主构造函数

class Fruits(var name: String = "PingGuo", val leve: Int? = 1, val number: Int? = 10, address: String = "YT") {

    //主构造函数的参数可以直接当属性来使用

    val MyName = name;
    val Num = number;

    override fun toString(): String {
        return "Name=" + MyName + "Num=" + Num + "Leve=" + leve;
    }
}

5.可见性为private 的主构造函数,使用次构造函数的委托进行赋值

class A private constructor(name: String) {

    val Name = name
    var Num: Int = 0

    constructor(name: String, num: Int) : this(name) {
        this.Num = num
    }

    fun NameXX(): String {
        return Name + "XXX"

    }

}

3.类的成员

  • 构造函数和初始化块
  • 函数
  • 属性:含有初始器、get访问器和set访问器,但都是可选
  • 嵌套类和内部类
  • 对象的声明
class Person {

    var name: String? = "Testing"   //属性

    var Address: String? = "zhangxinglu"    //含有get的属性
        get() = Address

    var AddressisEmpty: Boolean
        get() = this.Address!!.length == 0
        set(value) {
            AddressisEmpty = value
        }

    var setterVisibility: String = "abc"
        private set // 此 setter 是私有的并且有默认实现
    var setterWithAnnotation: Any? = null
        @Inject set // 用 Inject 注解此 setter

    var size:Int = 0
    val isEmpty get() = this.size == 0 // 具有类型 Boolean

    companion object {   //伴生对象

        var Handler_Tag_P = "Post"
        var Handler_Tag_G = "Get"

        fun getInstance(): Person {

            return Person()

        }

    }


    fun printName() {    //函数
        System.out.print("name :>>" + name)
    }


}

4.继承

在 Kotlin 中所有类都有一个共同的超类 Any ,这对于没有超类型声明的类是默认超类,Any 类:它除了 equals() 、 hashCode() 和 toString() 外没有任何成员。

tips 继承的规则:
   如果一个类从它的直接超类继承相同成员的多个实现, 它必须覆盖这个成员并提供其自己的实现(也许用继承来的其中之一)。 为了表示采用
从哪个超类型继承的实现,我们使用由尖括号中超类型名限定的 super:

super<Base> :
类和继承
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 {
// 编译器要求覆盖 f():
        override fun f() {
            super<A>.f() // 调用 A.f()
            super<B>.f() // 调用 B.f()
      }
}
open class A { //默认含有一个无参构造函数
    
    open  fun  cctest(){
        //默认为final方法,如果需要继承就需要使用open修饰
    }
    
}

class B : A() {

   final  override fun cctest() {//不加final 则可以在子类中继续覆盖,添加final修饰符,就不允许子类继续覆盖
        super.cctest()
    }
    override fun equals(other: Any?): Boolean {
        return super.equals(other)
    }

    override fun hashCode(): Int {
        return super.hashCode()
    }

    override fun toString(): String {
        return super.toString()
    }
}

有参构造函数的继承


//有参构造函数
open class c(name: String){
    open val x: Int get() {  //get方法的属性覆盖
        return 0
    }

    open val y: Int get() {  //get方法的属性覆盖
        return -1
    }

}
//子类同样包含,有参构造函数
class d(val name: String) : c(name) {
    init {
        abs(name)
    }

    fun abs(name: String?) {
        var ne = name
    }

    fun tabs() {
        val na = this.name
    }
}

//子类没有有参主构造函数,此构造函数就必须使用super关键字初始化基类或者委托给其他次构造函数初始化基类
class f : c {
    constructor(name: String) : super(name)   //super初始化父类的基类
    constructor(name: String, type: String) : super(name)
    constructor(name: String, type: String, num: Int) : this(name, type)  //委托给其他积累实现

    override val x: Int = 90
    override var y: Int = 190    //用var 属性覆盖一个val,反之是不可以的

}

5.抽象类 abstract class

类中某些成员可以声明为abstract,抽象成员在本类中可以不用实现。

open class Base {
    open fun f() {}
}

//抽象成员覆盖一个非抽象的开放成员
abstract class Derived : Base() {
      override abstract fun f()
}

6. 伴生对象(相当于Java中的静态方法/对象)


class Person {


    companion object {  //伴生对象

        var Handler_Tag_P = "Post"
        var Handler_Tag_G = "Get"

        fun getInstance(): Person {

            return Person()

        }
        
    }

}

使用伴生对象:

class  Max{
    
    var p = Person.getInstance()   //调用伴生对象的方法
    
    fun print(){
        System.out.print("Handler 1:>>"+Person.Handler_Tag_G)  //调用伴生对象的属性
        System.out.print("Handler 2:>>"+Person.Handler_Tag_P)
    }
    
}
  

6.编译期常量

已知值的属性可以使用 const 修饰符标记为 编译期常量。

这些属性需要满足以下要求:

  • 位于顶层或者是 object 的一个成员
  • 用 String 或原生类型 值初始化
  • 没有自定义 getter

这些属性可以用在注解中:

const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() { …… }

7.延迟初始化属性

关键字:lateinit

  • 该修饰符只能用于在类体中(不是在主构造函数中)声明的 var 属性
  • 并且仅当该属性没有自定义 getter 或 setter 时
  • 该属性必须是非空类型,并且不能是原生类型。

在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化。

public class MyTest {
      lateinit var subject: TestSubject
        @SetUp fun setup() {
            subject = TestSubject()
       }

      @Test fun test() {
              subject.method() // 直接解引用
      }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容