Kotlin中继承、类型转换、Any超类、object关键字详解

简介: Kotlin中继承、类型转换、Any超类、object关键字详解

一、继承、类型转换、Any超类

继承

Kotlin中类默认都是封闭的,要让某个类开放继承,必须使用open关键字修饰它。

open class Product(val name: String) {
    fun description() = "Product: $name"
    open fun load() = "Nothing..."
}
/**
 * 继承
 * 类默认都是封闭的,要让某个类开放继承,必须使用open关键字修饰它。
 */
class LuxuryProduct : Product("Luxury") {
    override fun load() = "LuxuryProduct loading..."
    fun special() = "LuxuryProduct special function"
}
fun main() {
    val p: Product = LuxuryProduct()
    println(p.load())
    /**
     * 类型监测  等同于java中的instanceof
     * Kotlin的is运算符是个不错的工具,可以用来检查某个对象的类型
     *
     * 解释:这里检查p变量的运行时类型,是否是Product类型,或者Product类型的子类型。
     * 这里的p对象的运行时类为LuxuryProduct类
     */
    println(p is Product)
    println(p is LuxuryProduct)
    println(p is File)
    /**
     * 类型转换
     * as操作符声明,这是一个类型转换
     */
    println((p as LuxuryProduct).special())
    if (p is LuxuryProduct) {
        println((p as LuxuryProduct).special())
    }
    /**
     * 智能类型转换
     * Kotlin编译器很聪明,只要能确定any is 父类条件检查属实,它就会将
     * any当做子类类型对待,因此,编译器允许你不经类型转换直接使用。
     */
    println(p.special())
    /**
     * Kotlin层次
     * 无须在代码里显示指定,每一个类都会继承一个共同的叫做Any的超类
     */
    println(p is Any)
    /**
     * Any类提供的这几个方法,在Kotlin编译器内部已经实现
     * 因为Kotlin的跨平台性,在不同平台输出的格式也不一样,所以在编译器内部进行了实现。
     */
    println(p.toString())
}

输出结果如下

LuxuryProduct loading...
true
true
false
LuxuryProduct special function
LuxuryProduct special function
LuxuryProduct special function
true
com.king.kotlin.kotlin04.LuxuryProduct@135fbaa4
Process finished with exit code 0

二、object关键字详解

使用object关键字有三种方式

  1. 对象声明
  2. 对象表达式
  3. 伴生对象

1、对象声明

/**
 * object关键字,你可以定义一个只能产生一个实例的类-单例
 * 使用object关键字有三种方式
 * 1.对象声明:对象声明有利于组织代码和管理状态,尤其是管理整个应用
 *             运行生命周期内的某些一致性状态。
 * 2.对象表达式
 * 3.伴生对象
 */
object ApplicationConfig {
    init {
        println("ApplicationConfig loading...")
    }
    fun doSomething() {
        println("doSomething")
    }
}
fun main() {
    //这里ApplicationConfig既是类名,又是对象名
    ApplicationConfig.doSomething()
    println(ApplicationConfig)
    println(ApplicationConfig)
}

输出结果如下

ApplicationConfig loading...
doSomething
com.king.kotlin.kotlin04.ApplicationConfig@28d93b30
com.king.kotlin.kotlin04.ApplicationConfig@28d93b30

2、对象表达式

open class Player {
    open fun load() = "loading nothing"
}
fun main() {
    /**
     * 对象表达式
     * 有时候你不一定非要定义一个新的命名类不可,也许你需要某个现有类的一种变体实例,
     * 但只需要用一次就行了,事实上,对于这种用完就丢的类实例,连命名就可以省了。
     * 这个对象表达式是XX的子类,这个匿名类依然遵循object关键字的一个规则,即一旦实例化
     * 该匿名类只能有唯一一个实例存在。
     */
    val p = object : Player() {
        override fun load() = "anonymous nothing..."
    }
    println(p.load())
}

输出结果如下

anonymous nothing...

3、伴生对象

open class ConfigMap {
    /**
     * 伴生对象
     * 如果你想将某个对象的初始化和一个类实例捆绑在一起,可以考虑使用伴生对象,
     * 使用companion修饰符,你可以在一个类定义里声明一个伴生对象,一个类里只能有一个
     * 伴生对象。
     */
    companion object {
        private const val PATH = "D:\\android.txt"
        fun load() = File(PATH).readText()
    }
}
fun main() {
    println(ConfigMap.load())
}

输出结果如下

great ssss


目录
相关文章
|
3月前
|
Kotlin
Kotlin类的定义、构造函数、封装、继承和多态
Kotlin类的定义、构造函数、封装、继承和多态
|
1月前
|
Kotlin
Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
面向对象编程(OOP)是一种编程范式,它通过创建包含数据和方法的对象来组织代码。相较于过程式编程,OOP 提供了更快更清晰的结构,有助于遵守 DRY(Don't Repeat Yourself)原则,使代码更易于维护和扩展。在 Kotlin 中,类和对象是 OOP 的核心。类作为对象的模板,定义了对象的行为和状态;对象则是类的具体实例。例如,`Car` 类可以定义汽车的品牌、型号等属性,以及如驾驶和刹车等功能。通过构造函数可以快速初始化对象的属性。此外,Kotlin 支持继承机制,子类可以从父类继承属性和方法,促进代码重用。
29 2
|
20天前
|
设计模式 安全 编译器
Kotlin 中的密封类:详解与应用
【8月更文挑战第31天】
44 0
|
20天前
|
设计模式 安全 数据库连接
|
20天前
|
存储 前端开发 编译器
深入理解Kotlin中的数据类及其应用
【8月更文挑战第31天】
10 0
|
2月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
40 6
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
|
1月前
|
JavaScript
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
|
3月前
|
编译器 Kotlin
Kotlin中类型转换
Kotlin中类型转换
199 6
|
3月前
|
存储 Java Kotlin
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象
Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象