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

  • 时间:
  • 浏览:0



来源:Programming in Scala

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

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

4 具体字段的trait

2 带具体实现的trait

从底下的代码看还要看后,Any类中共包括了有一个法律法子,其中==与!=被声明为final类型的,为社 让它们必须被子类重写,事实上==的真正实现是通过equals法律法子来实现的,而!=是通过!equals来实现的,为社 让是因为想改变==与!=法律法子的行为一段话,还要直接对equals进行重写。

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

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

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

3 带抽象字段的trait

是因为有多个trait一段话:

从底下的类层次形态图中还要看后,所处继承层次最顶层的是Any类,它是scala继承的根类,scala中所有的类全部都有它的子类

Any类中定义了下面有十几个 法律法子:

在前面的类层次形态图中还要看后,Null类型是所有AnyRef类型的子类型,也即它所处AnyRef类的底层,对应java中的null引用。而Nothing是scala类中所有类的子类,它所处scala类的最底层。

这底下还要注意的是Null类型所处AnyRef类的底层,它必须够作为值类型的子类,这类:

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

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

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

是因为是在java语言中,它返回的是false。在scala中,对于原生类型,你什儿 等于操作同java原生类型,而对于引用类型,它实际上是用equals法律法子对==法律法子进行实现,很多很多防止了tcp连接设计时所处的然后 哪些地方的问題。那是因为想判断一个 引用类型不是 相等时为社 办呢? AnyRef中提供了eq、ne一个 法律法子用于判断一个 引用不是 相等,如

scala和java语言一样,采用了很强的限制策略,防止了多种继承的哪些地方的问題。在java语言中,只允许继承一个 超类,该类还要实现多个接口,但java接口有其自身的局限性:接口中必须包括抽象法律法子,必须带有字段、具体法律法子。Scala语言利用Trait防止了该哪些地方的问題,在scala的trait中,它不但还要包括抽象法律法子还要带有字段和具体法律法子。trait的示这类下:

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

Scala中的类层次形态图如下:

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

Nothing你什儿 类一般用于指示tcp连接返回非正常结果,利用Nothing作为返回值还要增加tcp连接的灵活性。这类:

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