kotlin类的继承②(使用is运算符进行类型检测|使用as运算符进行类型转换|智能类型转换|any超类)(代码片段)

韩曙亮 韩曙亮     2023-01-22     771

关键词:

文章目录





一、使用 is 运算符进行类型检测



在 Kotlin 中 , 如果不确定一个 实例对象的类型 , 可以 使用 is 运算符进行判定 , 使用方法

实例对象 is 判定类型

上述用法可以判定 实例对象 是否是 判定类型 , 如果是 返回 true , 反之 返回 false ;


代码示例 : 在下面的代码中 , 调用 student is Person 判断 student 对象是否是 Person 类型 ;

open class Person(val name: String, val age: Int) 
    fun info() 
        println("name : $name, age : $age")
    

    open fun sayHello()
        println("Hello World")
    


class Student : Person("Tom", 18)
    override fun sayHello()
        println("Hello World Tom")
    


fun main() 
    var student = Student()
    var person = Person("Jerry", 12)

    println("student is Person : $student is Person")
    println("student is Student : $student is Student")

    println("person is Person : $person is Person")
    println("person is Student : $person is Student")

执行结果 :

student is Person : true
student is Student : true
person is Person : true
person is Student : false




二、使用 as 运算符进行类型转换 ( 智能类型转换 )



子类对象 声明为 父类类型 , 如果要 调用 子类 特有的方法 , 必须 使用 as 运算符进行 类型转换 ;


智能类型转换 : 使用 as 运算符进行 类型转换 , 只要进行一次类型转换 , 在后面还要调用子类成员时就可以直接调用 , 不再需要手动转换类型 ;


在下面的代码中 :

父类时 Person 类型 , 子类是 Student 类型 ;

创建 Student 对象 , 但是将其声明为 Person 类型 , 此时该对象只能调用 父类 Person 的成员 , 不能调用 Student 对象的特有成员 ;

var student: Person = Student()

student 实例对象 , 可以调用 Person 类中的 sayHello 成员函数 , 但是不能调用 Student 类中的 helloStudent 成员函数 ; 下图中没有 helloStudent 函数的调用提示 ;

student 对象转为 Student 类型 , 即可调用 Student 类中的 helloStudent 成员函数 ;

(student as Student).helloStudent()

在进行第一次转换之后 , 后面 student 对象 可以直接调用 helloStudent 函数 , 不再需要进行先转换类型再调用 , 这就是 智能类型转换 ;

    (student as Student).helloStudent()
    student.helloStudent()


代码示例 :

open class Person(val name: String, val age: Int) 
    fun info() 
        println("name : $name, age : $age")
    

    open fun sayHello()
        println("Hello World")
    


class Student : Person("Tom", 18)
    override fun sayHello()
        println("Hello World Tom")
    

    fun helloStudent()
        println("Hello Student")
    


fun main() 
    var student: Person = Student()

    println("student is Person : $student is Person")
    println("student is Student : $student is Student")

    student.sayHello()

    (student as Student).helloStudent()
    student.helloStudent()

执行结果 :

student is Person : true
student is Student : true
Hello World Tom
Hello Student
Hello Student




三、Any 超类



在 Java 中 , 所有的类都继承自 Object 类 ;

在 Kotlin 中 , 所有的类都继承自 Any 类 ;


Any 类原型如下 :

package kotlin

/**
 * Kotlin类层次结构的根。每个Kotlin类都有[Any]作为超类。
 */
public open class Any 
    public open operator fun equals(other: Any?): Boolean
    public open fun hashCode(): Int
    public open fun toString(): String

Kotlin 中的 equals , hashCode , toString 等函数在编译器中都已经实现 , 在不同平台的编译器中实现不同 ;

Kotlin 的跨平台能力比 Java 更强 , 为了支持跨平台 , Kotlin 在不同的平台中有不同的实现 ;

kotlin泛型②(可变参数vararg关键字与泛型结合使用|使用[]运算符获取指定可变参数对象)(代码片段)

...目录一、可变参数vararg关键字与泛型结合使用二、使用[]运算符获取指定可变参数对象一、可变参数vararg关键字与泛型结合使用如果泛型类型T的参数是vararg可变参数,则在接收可变参数时,需要使用Array<outT>类型的变量进行接... 查看详情

kotlin中is!isasas?的使用方式(代码片段)

1.is运算符相当于java中的instanceof,用来判断当前类型是不是对应的类型(可以是对应的类型的子类),说的很抽象,上代码看一下。funmain()valstr="helloWorld"println(strisString)输出:true2.!is是is的否定形... 查看详情

kotlin继承

Kotlin中所有类都继承该Any类,它是所有类的超类,对于没有超类型声明的类是默认超类:classExample//从Any隐式继承Any默认提供了三个函数:equals()hashCode()toString()注意:Any不是java.lang.Object。如果一个类要被继承,可以使用open关键... 查看详情

kotlin中继承类型转换any超类object关键字详解(代码片段)

...)println(p.load())/***类型监测等同于java中的instanceof*Kotlin的is运算符是个不错的工具,可以用来检查某个对象 查看详情

20175314《java程序设计》第四周学习总结

...继承下来的,只要C所继承的祖先类与A同包即可。instanceof运算符:除了之前在第二章总结的以外,还有:当子类创造的对象与父类去使用instanceof运算符时,得出的结果也是true。当子类新声明的变量名与继承的变量名相同时,继... 查看详情

kotlin类的继承①(使用open关键字开启类的继承|使用open关键字开启方法重写)(代码片段)

...open关键字开启方法重写一、使用open关键字开启类的继承Kotlin中的类默认都是封闭的,无法被继承,如果要想类被继承,需要在定义类时使用open关键字;定义一个普通的Kotlin类:classPerson(valname:String,valage:Int)funinfo()println("name:$name,age:$... 查看详情

kotlin类的继承①(使用open关键字开启类的继承|使用open关键字开启方法重写)(代码片段)

...open关键字开启方法重写一、使用open关键字开启类的继承Kotlin中的类默认都是封闭的,无法被继承,如果要想类被继承,需要在定义类时使用open关键字;定义一个普通的Kotlin类:classPerson(valname:String,valage:Int)funinfo()println("name:$name,age:$... 查看详情

我应该避免使用 C#“is”运算符进行相等检查吗? [关闭]

】我应该避免使用C#“is”运算符进行相等检查吗?[关闭]【英文标题】:ShouldIavoidusingtheC#"is"operatorforequalitychecks?[closed]【发布时间】:2021-08-2116:56:37【问题描述】:一位同事告诉我,我可以使用is和isnot代替相等运算符==... 查看详情

kotlin类的继承(代码片段)

与Java不同,kotlin使用冒号,而Java中使用extends,注意冒号后面需要调用夫类的构造器。属于单继承,使用open关键字允许继承classpackageloaderman.demoopenclassPerson(name:String)protectedvarmName:String=namefungetName():StringreturnmNamepackageloaderman.democlass... 查看详情

typescript构造函数和继承

...构造函数构造函数用constructor作为函数名。当我们使用new运算符调用类的时候,类的构造函数就会被调用。构造函数与普通函数相同,在构造函数中可以定义可选参数、默认值参数和剩余参数。构造函数的返回值类型永远为类的... 查看详情

多用as少用强制类型转换(代码片段)

...通过is判断操作是否合理,是否可以转换,然后再使用as运算符进行转换,或者使用强制类型转换。下面我们就来讲解一下为什么多使用as少使用强制类型转换。零、asandis使用as进行类型转换会比强制类型转换更加安全,而且运行... 查看详情

instanceof运算符(代码片段)

一instanceof运算符instanceof运算符用于:判断该运算符前面引用类型变量指向的对象是否是后面类,或者其子类、接口实现类创建的对象。如果是则返回true,否则返回false注:instanceof前一个操作数通常是一个引用类型变量,后面一... 查看详情

kotlin类与继承

类Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主构造函数等)和由大括号包围的类体组成。类头和类体都是可选的,如果一个类没有类体大括号可省略class NoBody类的构造函数一类可以有一个主构造... 查看详情

继承类的重载 >> 运算符

】继承类的重载>>运算符【英文标题】:Overloading>>operatorforinheritedclass【发布时间】:2015-09-2000:44:38【问题描述】:我将如何进行这项工作?教授指示我们使用私有变量。我是否必须设置新变量才能在Student构造函数中输... 查看详情

kotlin学习之路:继承(代码片段)

...承二.继承中的构造函数2.1继承中Java的构造函数2.2继承中Kotlin的构造函数2.3Kotlin多个构造函数的情况三.重写和重载3.1方法的重写3.2属性的重写四.super关键字4.1简单用法4.2复杂情况下的用法4.2.1子类重写方法中使用super4.2.2子类选择... 查看详情

java面向对象(继承)

继承对某一批类的抽象,减少代码量,便于方法的修改,类的管理子类不能继承父类:①构造方法②私有属性和方法③使用默认修饰符不在同包下继承初始化:父类属性->父类构造方法->子类属性->子类构造方法继承有哪些:①重载... 查看详情

kotlin中级---kotlin类之的继承.md

Kotlin继承类1.超类(Any)在Kotlin中,所有的类都是继承自Any类,这是一个没有父类型的类。即当我们定义各类时,它默认是继承于Any类的例如:classPerson因为Any这个类只是给我们提供了equals、hashcode、toString三个方法&#x... 查看详情

kotlin初学者继承(extend)(代码片段)

Kotlin继承(extend)        Kotlin允许一个类继承自另一个类        Kotlin中所有类都继承自Any类        Any类是所有类的超类,对于没有超类型声明的类是默认超类        Kotlin类默认都是封闭的,要让某个类... 查看详情