Scala根类详解

根类
图12展示了Scala类的层次结构。层次结构的根是类Any。Scala执行环境中的每个类都直接或间接地继承自该类。类Any有两个直接子类:AnyRef和AnyVal。
子类AnyRef表示在宿主系统中表示为一个对象的所有值。所有用户定义的Scala类都直接或间接的继承自该类。更进一步,所有用户定义的Scala类也都继承自特征scala.ScalaObject。由其他语言编写的类也都继承自scala.AnyRef,但是并没有继承scala.ScalaObject。

图12.1 Scala类层次结构
类AnyVal有固定数目的子类,它们描述了在宿主系统中没有作为对象来实现的那些值。
类AnyRef和AnyVal只需要提供在类Any中声明的成员,但是具体实现可以添加宿主有关的方法到这些类中(例如,一个实现可以有其自有的对象的根类)。
这些根类的签名描述如下。
package scala
/** 通用根类 */
abstract class Any {
/** 定义相等,在这里是抽象的 */
def equals(that: Any): Boolean
/** 值间的语义相等 */
final def == (that: Any): Boolean =
if (null eq this) null eq that else this equals that
/** 值间的语义不等 */
final def != (that: Any): Boolean = !(this == that)
/** Hash code, 这里是抽象的 */
def hashCode: Int = ...
/** 文本表示,这里是抽象的 */
def toString: String = ...
/** 类型测试,需要按照下面的方式内联化 */
def isInstanceOf[a]: Boolean = this match {
case x: a => true
case _ => false
}
/** 类型转换,需要按照下面的方式内联化 */
def asInstanceOf[A] = this match {
case x: A => x
case _ => if (this eq null) this
else throw new ClassCastException()
}
}
/** 所有值类型的根类 */
final class AnyVal extends Any
/** 所有引用类型的根类 */
class AnyRef extends Any {
def equals(that: Any): Boolean = this eq that
final def eq(that: AnyRef): Boolean = ... //引用相等
final def ne(that: AnyRef): Boolean = !(this eq that)
Scala 标准库
103
def hashCode: Int = ... //由内存地址计算得来
def toString: String = ... //由hashcode和类名得来
}
/** 应用于用户定义的scala类的混入类 */
trait ScalaObject extends AnyRef

对于测试x.asInstanceOf[T],如果T是一个数字值类,则做特殊处理。在此情况下的转换是应用一个转换方法x.to。对于不是数值的值x该操作将导致ClassCastException。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

关注超人学院java免费学习交流群:

时间: 2024-11-07 02:25:41

Scala根类详解的相关文章

Scala笔记整理(三):Scala面向对象—类详解1

[TOC] getter和setter 简单类和无参方法 需要说明的是,官方给出的参考资料对于这方面讲解得十分详细,目前入门来说,不需要达到这样的理解,只需要可以进行开发即可,这一部分我给出的是官方的一些文档说明,但是后面的定制和注解,就直接简单说明能用就好了. class PersonOps { private var age = 0 //你必须初始化一个字段 def increment() {age += 1} //方法默认是公有的 def currentAge() = age } 1)在S

Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念. Java中的单例 package cn.xpleaf.single; /** * 单例模式-饿汉式(在属性中先创建好对象,不管是否调用getInstance方法) * @author yeyonghao * */ public class User { private static User user = new User(); private User(){} //外界调用不到构造函数 publi

[鸟哥linux视频教程整理]02_03_Linux根文件系统详解

一.根文件系统详解: FHS:Linux /boot: 系统启动的相关文件,如内核.initrd,以及grub(bootloader) /dev: 设备文件 块设备:随机访问 字符设备:线性访问,按字符为单位. 设备号:主设备号(major)和次设备号(minor) /etc:配置文件 /home:用户的家目录,每个用户的家目录通常默认为/home/USERNAME /root: /lib:库文件 /lib/modules:内核模块文件 动态库:.dll .so(share object) 静态

QAction类详解:

先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action that can be inserted into widgets. In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为

URLConnection类详解

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html URLConnection概述 URLConnection是一个抽象类,表示指向URL指定资源的活动连接. URLConnection类本身依赖于Socket类实现网络连接.一般认为,URLConnection类提供了比Socket类更易于使用.更高级的网络连接抽象.但实际上,大多数程序员都会忽略它

ThreadLocal类详解

众所周知,ThreadLocal对象可以每一个线程保存一份值,可以避免因线程间共享数据带来的问题. 其实现的原理,大致如下,具体的可以参考JDK里的源码. Thread类中,有一个threadLocals字段,它是ThreadLocalMap类型(ThreadLocal里的一个静态内部类).该字段存放当前线程下,所有与ThreadLocal相关的值.该对象是一个Map,key为ThreadLocal对象,value为所存放的值. 在ThreadLocal类里,有两个重要的方法:set()和get

Cocos2d之Node类详解之节点树(二)

一.声明 本文属于笔者原创,允许读者转载和分享,只要注明文章来源即可. 笔者使用cocos2d框架的cocos2d-x-3.3rc0版本的源代码做分析.这篇文章承接上篇<Cocos2d之Node类详解之节点树(一)>. 二.简介 节点 一个Node对象. 节点树 上篇文章介绍到,Node类有一个成员变量 Vector<Node*> _children,这是一个保存所有子节点的数组,因为Node类采用遍历树的方式获取子节点进行渲染,所以我管这两个东西的结合叫节点树. 三.源码详解 &