scala 中 Any、AnyRef、Object、AnyVal 关系以及主要特点分析

  • Any 是一个 abstract 类, scala 中的顶级父类
  • AnyVal 是一个 abstract 类,继承 Any,目的是取代 primary 类型
  • AnyRef 是一个 trait,继承 Any,重写了 Any 中部分方法
  • Any 和 Object 定义上没有任何关系
  • AnyRef 和 Object 定义上没有任何关系
  • scala 的继承体系是通过 Any、AnyRef  实现的。为了兼容 java 的继承体系,scala 编译器将 AnyRef 置于与 Object 同等地位,二者的  Class 类型相同。因此凡是 Object 继承体系的子类,都是  AnyRef  的子类;而 AnyRef 继承体系生成的子类,也是 Object 的子类。这些子类既是 AnyRef 又是 Object,这样 scala 保证定义的类能够被 jvm 加载,而编码时我们按照 scala 语言书写即可。
  • scala 让编程者感觉 Any 类是  scala 的顶级父类。作为  jvm 来说,Object 才是顶级父类,scala 编译器必然将 Any、AnyRef 编译为 Object 的子类型,这是 scala 编译器来实现的。 编程者完全无感。
  • scala 类构造同时结合了 c++ 和 javascript 特点,使用方式类似于 javascript。

总结:scala 语法规定了自己的继承体系(Any),本质跟 java 不同,兼容 java。

package scala

abstract class Any {
  def equals(that: Any): Boolean // 值比较
  def hashCode(): Int // hash 值
  def toString(): String

  final def getClass(): Class[_] = sys.error("getClass")

  final def ==(that: Any): Boolean = this equals that // 值比较,参数可为 null
  final def !=(that: Any): Boolean = !(this == that) // 值比较
  final def ## : Int = sys.error("##") // hash 值,参数可为 null
  final def isInstanceOf[T0]: Boolean = sys.error("isInstanceOf") //是否为 T0 实例
  final def asInstanceOf[T0]: T0 = sys.error("asInstanceOf") //强转为 T0
}

abstract class AnyVal extends Any {
  def getClass(): Class[_ <: AnyVal] = null
}

trait AnyRef extends Any

 继承示例:

// 父类
class
PersonFather(name: String, age: Int) { println("PersonRather is created!") def walk(): Unit = { println("Person walking ...") } }
// 继承
class StudentSon(name: String, age: Int, var stuNo: Int) extends PersonFather(name, age) { println("StudentSon is created!") override def walk(): Unit = { super.walk() println("Student walking ......") } }

 

posted on 2020-05-11 00:03  一直小飞猫  阅读(4970)  评论(0编辑  收藏  举报

导航