zoukankan      html  css  js  c++  java
  • Kotlin学习系列(三)

    类声明

    Kotlin使用class关键字声明类:

    class Invoice{
    
    }
    

    Kotlin类声明基本包括header与body:

    [<Modifier>] <class> [<Visibility modifiers>]  <className> [<constructor>]
    [< body>] 
    

    构造器

    kotlin的类能有一个主要的构造器与多个次要的构造器。主构造器出现在类名的后面参数是可选的。

    class Person constructor(firstName: String){
        ...
    }
    

    如果主构造器没有注解或可见修饰符constructor关键字可以省略:

    class Person(firstName: String){
    ...
    }
    

    Kotlin能够使用constructor声明多个次要的构造器:

    class Person{
        constructor(parent: Person){
        
         }
         
           constructor(name: String, parent: Person){
        
         }
    }
    

    如果类有一个主构造器其他的构造器都需要去直接或间接的调用它:

    class Person(val name: String){
        constructor(name: String, parent: Person): this(name){
          
         }
    }
    

    创建实例

    Kotlin没有new关键字,创建类的实例只需要调用对应的构造方法:

    val invoice = Invoice()
    val person = Person("xx")
    

    继承

    所有的class有一个共同的超类Any如果类声明时没有指定超类默认继承Any:

    class Empty  //默认继承Any
    

    继承一个指定的类通过在class header后面添加冒号与父类:

    open class Base(p: Int)
    
    class Derived(p: Int): Base(p)  //指定构造器
    

    如果子类有主构造器可以在class header中初始化超类,如果该类没有主构造器由其他的构造器通过super关键字直接或间接始化超类:

    open class Base(p: Int)
    
    class Derived: Base{
    
        constructor(p: Int): super(p){
    
        }
    }
    

    open注解与java中的final相反表示类是否可以被继承,Kotlin中所有的类默认是final

    重写成员方法

    Kotlin使用open标记成员是否可被重写,override显示说明该成员重写父类方法:

    open class Base {
        open fun v() {}
        fun nv() {}
    }
    class Derived() : Base() {
        override fun v() {}
    }
    

    属性

    声明属性语法:

    var <propertyName>: <PropertyType> [= <property_initializer>]
      [<getter>]
      [<setter>]
    

    除了初始化和getter/setter是可选的以外属性类型如果能够推断出的话也可以省略。只读属性的声明
    语法与可读属性声明只有两个差别:使用val替换var、没有setter。

    Kotlin中的类声明可变的(var)属性与只读(val)属性:

    class Person{
        public var name: String = ""
        public val IdCard: String =  "xxx"
    
    }
    
    

    通过属性名称使用类中的属性,类似Java中的Field:

    fun out(p: Person){
    
        println("name: ${p.name}")
        println("id: ${p.id}")
    }
    

    getter/setter:

        public var name: String
        get() = "undefined"
        set(value) {
    
        }
    

    如果只需要重新定义getter/setter的可见性或注解它们但不需要去更改它们行为可以只定义getter/setter不需要定义主体:

        public var name: String = ""
        get() = "undefined"
        private @Inject set
    

    Kotlin中不能有field,但是在自定义getter/setter的时候可能需要去直接访问属性而不是通过getter/settter。Kotlin自动提供
    一个备用字段(field),通过它使用使用属性标识符来访问它。

        public var fieldProp = ""
        get() = field
        set(value) {
            field = value;
        }
    

    编译时常量

    如果属性能在编译时就已经确定它的值可以使用const关键字声明一个编译时常量但它需要满足以下要求:

    1. 只要出现在最顶层或对象内部
    2. 只支持String与原始类型
    3. 无法算自定义getter
    const val COMPILE_CONSTANT = ""
    



    《架构文摘》每天一篇架构领域重磅好文,涉及一线互联网公司应用架构(高可用、高性 能、高稳定)、大数据、机器学习等各个热门领域。

  • 相关阅读:
    关于JS中变量提升的规则和原理的一点理解(二)
    JS 引擎的执行机制
    关于遍历对象的属性的一点新认识,如何只遍历对象自身的属性
    【转】 CSS十问——好奇心+刨根问底=CSSer
    【转】彻底理解js中this的指向,不必硬背。
    【转】 Git——如何将本地项目提交至远程仓库
    博客园的第一篇文章
    《深度学习之kaggle》:六、没有预训练的YOLO5X训练方式小改,准确率小幅提升
    《深度学习之kaggle》:五、没有预训练的YOLO5X训练完毕
    Webdriver如何解决页面元素过期:org.openqa.selenium.StaleElementReferenceException: Element not found in the cache
  • 原文地址:https://www.cnblogs.com/xwgblog/p/5340680.html
Copyright © 2011-2022 走看看