Scala入门到精通——第十节 Scala类层次结构、Traits初步

  • 时间:
  • 浏览:1

根类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等方式。

从字节码文件还并能看出,中有 具体实现的trait是通过java中的抽象类来实现的。

从里面的类层次价值形式图中还并能就看,位于继承层次最顶层的是Any类,它是scala继承的根类,scala中所有的类都有它的子类

Any类中定义了下面十几个 方式:

scala和java语言一样,采用了很强的限制策略,解决了多种继承的问题图片。在java语言中,只允许继承原先超类,该类还并能实现多个接口,但java接口有其自身的局限性:接口中越来越包括抽象方式,越来越中有 字段、具体方式。Scala语言利用Trait解决了该问题图片,在scala的trait中,它不但还并能包括抽象方式还还并能中有 字段和具体方式。trait的示同类下:

值得一提的是,()还并能作为Unit类型的实例,它同样还并能调用toString等方式

Scala中的类层次价值形式图如下:

4 具体字段的trait

下面的代码演示了可能性使用trait

在本课程的第二节中.我 提到,scala中的==操作它不区分你是原生类型还是引用类型,同类

生成的字节码文件反编译后的结果:

Nothing你这俩 类一般用于指示多线程 池池返回非正常结果,利用Nothing作为返回值还并能增加多线程 池池的灵活性。同类:



来源:Programming in Scala

这里定义的特质将生成原先字节码文件:

3 带抽象字段的trait

scala采用与java相同原生类型存储方式,可能性性能方面及与java进行操作方面的考虑,scala对于原生类型的基本操作如加减乘除操作与java是一样的,当还要遇到你这俩 方式调用时,则使用java的原生类型封装类来表示,如Int类型对应于java.lang.Integer类型,你这俩 转换对于.我 使用者来说是透明的。

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

1 当做java接口使用的trait,如

从里面的代码看还并能就看,Any类中共包括了兩个方式,其中==与!=被声明为final类型的,因此它们越来越被子类重写,事实上==的真正实现是通过equals方式来实现的,而!=是通过!equals来实现的,因此可能性想改变==与!=方式的行为一句话,还并能直接对equals进行重写。

可能性是在java语言中,它返回的是false。在scala中,对于原生类型,你这俩 等于操作同java原生类型,而对于引用类型,它实际上是用equals方式对==方式进行实现,原先解决了多线程 池池设计时位于的你这俩 问题图片。那可能性想判断原先引用类型否有相等时为什办呢? AnyRef中提供了eq、ne原先方式用于判断原先引用否有相等,如

打上去公众微信号,还并能了解更多最新Spark、Scala相关技术资讯

2 带具体实现的trait

在前面的类层次价值形式图中还并能就看,Null类型是所有AnyRef类型的子类型,也即它位于AnyRef类的底层,对应java中的null引用。而Nothing是scala类中所有类的子类,它位于scala类的最底层。

这里面还要注意的是Null类型位于AnyRef类的底层,它越来越够作为值类型的子类,同类:

可能性有多个trait一句话: