本章主要从整体层面了解Scala中的类层级关系。

一、Scala的类层级

  在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类。在Scala中所有类的最终父类为Any类,所以Any类中的所有方法都可以在Scala中任意类中使用。但是这并不是说Scala中的Any类就类似于Java中的Object类,Scala中真正地位类似于Java中Object类的是AnyRef类。

  在Scala中还提供了两个类NullNothing,这两个类在整个Scala类层级的最底层,其中Nothing类是所有类的最终子类,Nothing类直接或间接继承其他任何类。

1、整体类层级图

  下图展示了Scala中的整体类层级图,其中Any位于最顶端,Nothing位于最底端。

  

2、Any类结构

  这一节中我们看一下Any类中定义了哪些方法。

  从Scala API文档中可以看到,Any类中提供==, !=, equals, ##, hashCode, toString, isInstanceOf[TO], asInstanceOf[TO]共八个方法。其中==, !=, ##, asInstanceOf[TO], isInstanceOf[TO]final类型的,不能在子类中使用override关键字进行重写。在Scala中对于==方法,如果判断对象为引用类型,调用该方法等同于调用该对象的equals方法。

  

  Any类的两个直接子类是AnyValAnyRef,其中AnyVal是Scala中的值类型,比如Double, Float等的直接父类,注意这里Unit类型也是AnyVal类型的直接子类。而AnyRef则是Scala中所有引用类型类的父类,类似于Java中的Object类。

  

二、原始类型是如何实现的

  对Java熟悉的话,应该会对int类型和Integer类型有一定的了解。在Scala中对Int类型变量的处理也和Java中类似,Int类型提供加或乘这样的简单操作,但如果需要调用toString方法或者将Int值赋给Any类型变量时,Int型变量会自动转化成Integer类型。这个过程和Java中的自动装箱有些类似。

  我们首先看一下下面这段Java代码

boolean isEqualInt(int x, int y) {
return x == y;
}
System.out.println(isEqual(421, 421)); boolean isEqualInteger(Integer x, Integer y) {
return x == y;
}
System.out.println(isEqualInteger(421, 421));

  代码在IDEA中的运行结果如下

  

  isEqualInt方法接收到传入的两个整数后直接判断值是否相等,得到的结果为true。但是isEqualInteger方法接收到整型参数后,哪怕是值相等的整型参数,也会首先自动装箱成两个Integer类型对象,并且两个Integer对象是不同的对象,调用==方法得到的结果为false

  再看一段Scala中的代码,仍然定义两个函数、

def isEqualInt(x: Int, y: Int) = x == y
isEqualInt(421, 421) def isEqualAny(x: Any, y: Any) = x == y
isEqualAny(421, 421)

  运行结果如下,

  

  由于在Scala中,引用类型调用==方法等同于调用equals方法,所以isEqualAny方法的返回结果也是true

  那么,如果在Scala中就是需要判断两个引用类型对象的引用是否相等,应该怎么办?在AnyRef类中,Scala提供了eqne方法。

val x = new String("abc")
val y = new String("abc") x == y
x eq y
x ne y

  运行结果如下,

  

三、底层类型

  这里主要讨论上面的类继承关系图中最底层的两个类scala.Nullscala.Nothing。Scala中可以使用者两个类统一的处理一些面向对象编程的边界情况。

1、Null类

  比如说在Java中,null值是没有对应的类型的,如果将某个变量赋值null然后调用getClass方法,会报一个NullPointerException,如下图所示。

  

  但是在Scala中null值的类型为NullNull类型所有引用类型类的子类,而不是值类型的子类。所以,不能将null赋值给Int类型变量。

val i: Int = null

  执行结果如下,

  

2、Nothing类

  Nothing类位于Scala类继承关系中的最底层,是Scala中任何类的子类,包括上面的Null类。

  由于Nothing类是任何类的子类,所以可以以如下形式来使用该类。

def error(message: String): Nothing =
throw new RuntimeException(message) def divide(x: Int, y: Int): Int =
if (y != 0) x / y
else error("can't divide by zero")

  在前面我们知道了,Scala中的执行语句都有一个返回结果类型,对于if语句来说,返回类型为两个分支的公共父类,而这里if分支的返回类型为IntIntelse的返回类型Nothing的父类,所以divide方法的最终返回类型仍然是Int

Programming In Scala笔记-第十一章、Scala中的类继承关系的更多相关文章

  1. Programming In Scala笔记-第十七章、Scala中的集合类型

    本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...

  2. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  3. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Programming In Scala笔记-第七章、Scala中的控制结构

    所谓的内建控制结构是指编程语言中可以使用的一些代码控制语法,如Scala中的if, while, for, try, match, 以及函数调用等.需要注意的是,Scala几乎所有的内建控制结构都会返 ...

  5. 《图解HTTP》阅读笔记--第十一章针对web的攻击技术

    第十一章.针对WEB的攻击技术 ----<图解HTTP>阅读笔记攻击目标---Web简单的HTTP协议本身并不存在安全性 问题,协议本身并不会成为被攻击的对象,应用HTTP的服务器和客户端 ...

  6. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

  7. o'Reill的SVG精髓(第二版)学习笔记——第十一章

    第十一章:滤镜 11.1滤镜的工作原理 当SVG阅读器程序处理一个图形对象时,它会将对象呈现在位图输出设备上:在某一时刻,阅读器程序会把对象的描述信息转换为一组对应的像素,然后呈现在输出设备上.例如我 ...

  8. C++ primer plus读书笔记——第14章 C++中的代码重用

    第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...

  9. Java程序设计基础笔记 • 【第7章 Java中的类和对象】

    全部章节   >>>> 本章目录 7.1 理解类和对象 7.1.1 对象 7.1.2 抽象与类 7.1.3 类与对象的关系: 7.2 Java中的类和对象 7.2.1 类的定义 ...

随机推荐

  1. 使Asp.net Core同时支持输出Json/Xml

    我们知道Asp.net Core是支持输出为Json格式的.同时也支持输出为xml格式.只要我们正确的配置.并在Request时指定正确的Accept,即可根据不同的Header来输出不同的格式. 前 ...

  2. 什么是HTTP Referer?

    什么是Referer? Referer是 HTTP请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer.比如我在www.sojson ...

  3. [BZOJ 3456]城市规划

    Description 题库链接( bzoj 权限题,可以去 cogs 交♂ 题库链接2 求含有 \(n\) 个点有标号的简单无向联通图的个数.方案数对 \(1004535809(479\times ...

  4. ●BZOJ 4665 小w的喜糖

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4665 题解: 容斥,dp令 v[i] 表示原来拥有i类糖果的人数. (一个套路,首先把每个糖 ...

  5. Orz

    OR: 说实话,感觉Virtual Judge挺好使的,至少到现在,Uva都没注册成功过QAQ,估计是校园网的问题 不得不说现在课越来越多,而且对于我们这种学校ACM才开展两年的来说,时间真的好有限, ...

  6. BZOJ3052(树上带修莫队)

    树上莫队的基本思路是把树按dfs序分块,然后先按x所在块从小到大排序,再按y所在块从小到大排序,处理询问即可. 这道题带修改,再加一个时间维即可. 设块大小为T,那么时间复杂度为$O(nT+\frac ...

  7. 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】

    转自:http://www.hangge.com/blog/cache/detail_1461.html 一.MADVR介绍 MADVR 是一款超强的视频插件,其配合高清播放软件,可以做到目前 PC  ...

  8. 基于 HTML5 的 WebGL 3D 智能楼宇监控系统

    前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...

  9. BigData-‘基于代价优化’究竟是怎么一回事?

    本文由  网易云发布. 本文具体讨论了Join基础算法的一种优化方案  – Runtime Filter,在本文最后还引申地聊了聊谓词 下推技术.同时,在本文文章开头,笔者引出了两个问题,SQL执行引 ...

  10. SynchronizedMap和ConcurrentHashMap的深入分析

    http://blog.sina.com.cn/s/blog_5157093c0100hm3y.html java5中新增了ConcurrentMap接口和它的一个实现类ConcurrentHashM ...