构造函数

Kotlin的类包括1个主构造函数和多个次构造函数

主构造函数

  1. 其中主构造函数会紧跟类名进行声明。

  2. 声明主构造函数的关键字为constructor,主构造函数没有任何注解或者可见性修饰符,可省略该关键字。

  3. 主构造函数不包括任何代码,所有构造函数会在init代码块执行,执行顺序按照从上到下执行。

  4. 主构造函数中的参数,只能在属性初始化init代码块中识别与执行,也可以在主构造函数中声明属性。

  5. 可见性修饰符包括publicprotectedprivateinternal

    • 默认为public
    • private只在本文件中可见
    • internal只在本模块中可见
    • protected不能用于顶层声明
      _ps: 模块的范围可以理解为是Modules,比如IntelliJ IDEA 模块Maven 项目;Gradle 源集;
class Demo2Class public constructor(val name: String, age: Int) {

    val firstProperty = "第一次初始化属性1:姓名: $name".also(::println)

    init {
        println("init代码块中可以获取到属性name:$name 和参数age:$age")
    }

    val secondProperty = "第二次初始化属性2: $age"                    
                                                          
   init {
        println("secondProperty 初始化完成:$secondProperty")
        println("init代码块与属性初始化按照顺序依次执行")
    }                                               

    init{
        print()
    }

    fun print(){
        System.out.println("主构造函数中可以声明属性name:$name,和参数age(参数在fun中不可见)")

    }
}

/**
输出如下:

第一次初始化属性1:姓名: liyao
init代码块中可以获取到属性name:liyao 和参数age:18
secondProperty 初始化完成:第二次初始化属性2: 18
init代码块与属性初始化按照顺序依次执行
主构造函数中可以声明属性name:liyao,和参数age(参数在fun中不可见)

*/

次构造函数

  1. 次级构造函数 使用constructor关键字在类内部进行声明
  2. 次级构造函数同样需要指定注解或者可见型修饰符
  3. 次级构造函数要委托(继承)主构造函数,如果不包括主构造函数,则隐式委托默认主构造函数
constructor(name: String, age: Int, clazz: String) : this(name, age) 
  1. 所有的init块及属性初始化理论上都是主构造函数的body,主次关系,决定了先后顺序,在次级构造函数内代码执行之前,先执行初始化代码块,和代码物理顺序无关
  2. 次级构造函数无法像主构造函数那样声明属性,参数也不能被初始化参数使用

继承

所有的对象都继承于Any类,提供 equals()hashCode()toString()

  1. Any 并不等同与ObjectAny是Kotlin的类型,Object对于Kotlin来说,是平台类型
  • Kotlin本身具备空安全的特性,但是由于Java的对象是都可以为null的,这就产生了矛盾
  • 针对Java中声明的类型,Kotlin称作这些类型为平台类型,会降低一部分类型的空安全要求,编译时不会报可控错误。如Object的子类。
  • 同时,Kotlin 又特殊处理一部分 Java 类型进行了类型映射,均是是非String的基础类型
  • Any不包括Objectwait()notify()方法,如果希望使用Object类型,可以使用 as 关键字进行转型
 (foo as java.lang.Object).wait()
  1. 类继承。默认情况下,所有Kotlin的类都是final类, 即不可被继承的类,如果需要继承,需要在类前添加openabstract关键字。
    ps:open标记可以理解为普通java类,abstract可以理解为抽象java类。这里可以看到kotlin的语法的衍进与安全性
open class Parent(p: Int){ }
...

class Children(p: Int) : Parent(p: Int){

}
  1. 方法重写-1。 默认情况下,open类的中的方法是不可以被override的, 如需override需要将方法标记为open,重写时,子类要在方法前标注为override
  //in parent
  open foo(p: Int) {  }

  //in children
  override foo(p: Int) {  }
  1. 方法重写-2。被override标记的方法(重写方法),是可以再被它的子类进行重写。如不希望其被重写,可以使用
  final override foo(p: Int) {  }
  1. 属性重写 待补充

Kotlin中的接口

Kotlin的多继承问题

  1. Kotlin和Java一样,支持单继承(extends),多实现(implements)。

  2. 在继承过程中,可能出现方法名的重复,可以只实现一个方法,再调用父类方法时可以通过super<Parent>.foo() 区分不同的实现


类属性

  1. 属性的完整定义包括关键字属性名属性类型初始化方法gettersetter
var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
  1. kotlin 的gettersetter中有可以访问到一个field属性,被称为 backing property,接口中不支持backing property。可以简单理解为一个中间属性,协助完成gettersetter的赋值

  2. 非空类型,如StringInt的类型都是非空类型,定义初始化时要给予初始值。 如果要定义空类型一般需要在类型后面加号,如String?Int?

class Demo2Class{ 

  var test: String = ""    // 非空类型,要初始化~
        get() = "${field}3333"  // !!! field 是backing property,这里不能直接访问this.test,会造成循环访问,stackoverflow
        set(value) {
            System.out.println("in setter")
            System.out.println("value:  $value")
            field = "$value!"     // !!!  field 是backing property, 单独设置filed不会改变test的值,必须与getter进行联动
            System.out.println("field $field")
        }
}
 
val demo = Demo2Class()
demo.test = "123"  // 触发setter
System.out.println("demo.test get()= ${demo.test}") // 触发getter
  1. var是读写类型的关键字,如果要定义只读类型需要使用关键字 val

  2. 常量使用const val修饰

延迟初始化

非空类型的属性必须在构造函数中被初始化(ps:属性定义也是构造函数的子过程),为了延迟初始化,可以使用lateinit关键词修饰,有两个限制:

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

推荐阅读更多精彩内容