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

本文深入探讨Scala的类层次结构,解析原生类型实现,讲解Nothing和Null类型,介绍Traits的多种使用方式,包括作为接口、带具体实现、抽象字段和具体字段的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节主要内容

  1. Scala类层次结构总览
  2. Scala中原生类型的实现方式解析
  3. Nothing、Null类型解析
  4. Traits简介
  5. Traits几种不同使用方式

1 Scala类层次结构

Scala中的类层次结构图如下:

这里写图片描述
来源:Programming in Scala

从上面的类层次结构图中可以看到,处于继承层次最顶层的是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类中共包括了五个方法,其中==与!=被声明为final类型的,因此它们不能被子类重写,事实上==的真正实现是通过equals方法来实现的,而!=是通过!equals来实现的,因此如果想改变==与!=方法的行为的话,可以直接对equals进行重写。

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

scala> 2.0.hashCode
res5: Int = 1073741824

scala> 2.0 toString
res6: String = 2.0

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

scala> ().hashCode
res7: Int = 0

scala> ().toString
res8: String = ()

scala> ()==()
<console>:8: warning: comparing values of types Unit and Unit using `==' will al
ways yield true
              ()==()
                ^
res9: Boolean = true

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

2 Scala中原生类型的实现方式解析

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

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

scala> "abc"=="abc"
res10: Boolean = true

如果是在java语言中,它返回的是false。在scala中,对于原生类型,这种等于操作同java原生类型,而对于引用类型,它实际上是用equals方法对==方法进行实现,这样避免了程序设计时存在的某些问题。那如果想判断两个引用类型是否相等时怎么办呢? AnyRef中提供了eq、ne两个方法用于判断两个引用是否相等,如

scala> val x=new 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值