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

  • 时间:
  • 浏览:1
  • 来源:uu快3注册_uu快3官网

scala和java语言一样,采用了很强的限制策略,避免了多种继承的难题。在java语言中,只允许继承三个 超类,该类才能实现多个接口,但java接口有其自身的局限性:接口中不才能包括抽象法子,不才能含高字段、具体法子。Scala语言利用Trait避免了该难题,在scala的trait中,它不但才能包括抽象法子还才能含高字段和具体法子。trait的示类似下:

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

下面的代码演示了因此使用trait

从上方的类层次特征图中才能看完,处于继承层次最顶层的是Any类,它是scala继承的根类,scala中所有的类都在它的子类

Any类中定义了下面十几次 法子:

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,而对于其它平台有不同的实现。

因此有多个trait搞笑的话:

根类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等法子。

Nothing一种类一般用于指示应用程序返回非正常结果,利用Nothing作为返回值才能增加应用程序的灵活性。类似:



来源:Programming in Scala

在前面的类层次特征图中才能看完,Null类型是所有AnyRef类型的子类型,也即它处于AnyRef类的底层,对应java中的null引用。而Nothing是scala类中所有类的子类,它处于scala类的最底层。

这上方时需注意的是Null类型处于AnyRef类的底层,它才能才能作为值类型的子类,类似:

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

从上方的代码看才能看完,Any类中共包括了3个法子,其中==与!=被声明为final类型的,因此它们不才能被子类重写,事实上==的真正实现是通过equals法子来实现的,而!=是通过!equals来实现的,因此因此想改变==与!=法子的行为搞笑的话,才能直接对equals进行重写。

值得一提的是,()才能作为Unit类型的实例,它同样才能调用toString等法子

2 带具体实现的trait

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

3 带抽象字段的trait

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

换成公众微信号,才能了解更多最新Spark、Scala相关技术资讯

Scala中的类层次特征图如下:

4 具体字段的trait

因此是在java语言中,它返回的是false。在scala中,对于原生类型,一种等于操作同java原生类型,而对于引用类型,它实际上是用equals法子对==法子进行实现,本来避免了应用程序设计时处于的许多难题。那因此想判断三个 引用类型与非 相等时为什办呢? AnyRef中提供了eq、ne三个 法子用于判断三个 引用与非 相等,如