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


目录
相关文章
|
设计模式 Android开发 Kotlin
Android经典实战之Kotlin委托模式和by关键字
本文介绍了Kotlin中`by`关键字在类及属性委托中的运用,通过实例展示了如何利用类委托简化接口实现,以及如何借助标准与自定义属性委托管理属性的读写操作。通过`by`关键字的支持,Kotlin使得委托模式的实现更为直观且高效。
373 4
|
9月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
285 1
|
9月前
|
Java
课时78:Object类的基本概念
Object类的主要特点是可以解决参数的统一问题,使用object类可以接受所有的数据类型。 1. Object类简介 2. 观察Object类接收所有子类对象 3. 使用Object类接收数组
196 0
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
163 8
|
安全 IDE Java
Kotlin教程笔记(3) - 空类型和智能类型转换
Kotlin教程笔记(3) - 空类型和智能类型转换
104 1
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
509 4
|
安全 IDE Java
Kotlin教程笔记(3) - 空类型和智能类型转换
Kotlin教程笔记(3) - 空类型和智能类型转换
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
459 20
|
安全 IDE Java
Kotlin教程笔记(3)- 空类型和智能类型转换
本教程详细讲解了Kotlin中的空类型、非空与可空类型、可空类型操作符、安全调用操作符、Elvis运算符、非空断言运算符以及智能类型转换等内容,帮助开发者更好地理解和使用Kotlin的空安全机制。适合希望深入了解Kotlin语法的开发者。快速入门请参考“简洁”系列教程。
123 3
|
安全 IDE Java
Kotlin 学习笔记- 空类型和智能类型转换
Kotlin 学习笔记聚焦于空类型和智能类型转换,深入解析非空与可空类型、安全调用操作符、Elvis 运算符、非空断言运算符及智能类型转换等内容,助你高效掌握 Kotlin 语言特性,避免 NullPointException 异常,提升代码质量。
113 2