Programming In Scala笔记-第十一章、Scala中的类继承关系
2016-10-06 23:14
260 查看
本章主要从整体层面了解Scala中的类层级关系。
在Scala中还提供了两个类
从Scala API文档中可以看到,
我们首先看一下下面这段Java代码
代码在IDEA中的运行结果如下
再看一段Scala中的代码,仍然定义两个函数、
运行结果如下,
由于在Scala中,引用类型调用
那么,如果在Scala中就是需要判断两个引用类型对象的引用是否相等,应该怎么办?在
运行结果如下,
但是在Scala中
执行结果如下,
由于
在前面我们知道了,Scala中的执行语句都有一个返回结果类型,对于
一、Scala的类层级
在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了
Object类。在Scala中所有类的最终父类为
Any类,所以
Any类中的所有方法都可以在Scala中任意类中使用。但是这并不是说Scala中的
Any类就类似于Java中的
Object类,Scala中真正地位类似于Java中
Object类的是
AnyRef类。
在Scala中还提供了两个类
Null和
Nothing,这两个类在整个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类的两个直接子类是
AnyVal和
AnyRef,其中
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提供了
eq,
ne方法。
val x = new String("abc") val y = new String("abc") x == y x eq y x ne y
运行结果如下,
三、底层类型
这里主要讨论上面的类继承关系图中最底层的两个类scala.Null和
scala.Nothing。Scala中可以使用者两个类统一的处理一些面向对象编程的边界情况。
1、Null类
比如说在Java中,null值是没有对应的类型的,如果将某个变量赋值
null然后调用
getClass方法,会报一个
NullPointerException,如下图所示。
但是在Scala中
null值的类型为
Null。
Null类型所有引用类型类的子类,而不是值类型的子类。所以,不能将
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分支的返回类型为
Int且
Int是
else的返回类型
Nothing的父类,所以
divide方法的最终返回类型仍然是
Int。
相关文章推荐
- Programming In Scala笔记-第十一章、Scala中的类继承关系
- 友元关系与继承——《C++ primer》笔记,书中的小bug
- Hibernate笔记=>继承关系的映射[转 王继彬]
- scala学习笔记:理解类继承
- scala 学习笔记(06) OOP(下)多重继承 及 AOP
- Android Studio 使用笔记:查看类结构和继承关系
- Hibernate 3.2 学习笔记 映射继承关系
- scala学习笔记(七) 继承
- scala总结(3)-- scala中常用类型继承关系
- Programming in Scala (Second Edition) 读书笔记1 为什么选择scala
- Hibernate笔记——表的的4种继承关系
- hibernate 第十一章 映射继承关系
- OC面向对象继承关系和组合关系笔记
- 【Hibernate学习笔记】映射继承关系
- scala学习笔记:理解类继承
- Hibernate笔记=>继承关系的映射
- 【重构笔记】重构手法之处理继承关系
- java集合复习笔记-java集合继承关系图
- spring学习笔记(5)——bean的继承与依赖关系
- Hibernate笔记——表的的4种继承关系