类结构

作者: LuciferTM | 来源:发表于2016-11-23 16:23 被阅读40次

    Scala类结构

    scala和python类似,scala中所有值都是继承自Any,包括函数。所以在scala之中函数是个类!
    下图就是scala中类的继承结构

    scala类结构.png

    从上面的类层次结构图中可以看到,处于继承层次最顶层的是Any类,它是scala继承的根类,scala中所有的类都是它的子类 Any类中定义了下面几个方法:

    //==与!=被声明为final,它们不能被子类重写
    final def ==(that: Any): Boolean
    final def !=(that: Any): Boolean
    def equals(that: Any): Boolean
    def hashCode: Int
    def toString: String
    

    根类Any有两个子类,它们分别是AnyVal和AnyRef,其中AnyVal是所有scala内置的值类型( Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit.)的父类,其中 Byte, Short, Char, Int, Long, Float, Double, Boolean与Java中的byte,short,char,int,long,float,double,boolean原生类型对应,而Unit对应java中的void类型,由于( Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit)继承AnyVal,而AnyVal又继承Any,因此它们也可以调用toString等方法。

    AnyRef是Any的另外一个子类,它是scala中所有非值类型的父类,对应Java.lang.Object类(可以看作是java.lang.Object类的别名),也即它是所有引用类型的父类(除值类型外)。那为什么不直接Java.lang.Object作为scala非值引用类型的父类呢?这是因为Scala还可以运行在其它平台上如.Net,所以它使用了AnyRef这个类,在JVM上它对应的是java.lang.Object,而对于其它平台有不同的实现。

    这里使用一个例子来证明scala中所有的类型都是继承自Any:

    1.png
    2.png

    Nothing、Null类型解析

    在前面的类层次结构图中可以看到,Null类型是所有AnyRef类型的子类型,也即它处于AnyRef类的底层,对应java中的null引用。而Nothing是scala类中所有类的子类,它处于scala类的最底层。 这里面必须注意的是Null类型处于AnyRef类的底层,它不能够作为值类型的子类,例如:

    3.png

    Nothing这个类一般用于指示程序返回非正常结果,利用Nothing作为返回值可以增加程序的灵活性。例如:

    4.png

    相关文章

      网友评论

          本文标题:类结构

          本文链接:https://www.haomeiwen.com/subject/jwkvpttx.html