Scala类的层级关系


一:介绍
在Scala里面每个类都继承自通用的名为Any的超类,因为每个子类都是Any的子类,所有定义在Any中的方法就是共同的方法,它可以被任何对象调用,Nothing是所有其它类的子类。


二:Scala的类层级

Any类中包括以下方法
  def equals(that: Any): Boolean
  def hashCode(): Int
  def toString(): String
  def getClass(): Class[_]
  final def ==(that: Any): Boolean
  final def != (that: Any): Boolean
  final def ##(): Int
  def isInstanceOf[T0]: Boolean
  def asInstanceOf[T0]: T0

也就是说Scala里的每个对象都可以调用== !=或equals等函数,但是由于个别函数是final修饰的,所以不能被重写。

Any类有两个子类,AnyVal和AnyRef。

AnyVal是Scala里每个内建值类的父类。有9个这样的值类:Byte,Short,Char,Int,Long,FLoat,Double,Boolean和Unit。其中前8个都是对应到Java的基本类型,由于这些类的实例都是写成字面量,所以不能使用new创造这些类的实例,Unit对应的大约就是Java的void类型,没有返回值。

值类不是其它类的子类,但是不同的值类之间可以隐士互相转换,需要时可以将Int类型转换成Long类型。
隐士转换还用来为值类型添加更多的功能,比如Int的max,min等,是Scala.Int类中没有的函数,是Scala.RichInt中的。这就是Scala.Int到Scala.RichInt的隐士转换。

AnyRef是Scala里面所有引用类的基类,也就是Java中Object的别名。

在Scala中,==和equasl是相同的,都是比较值,而在Java中==是比较的引用。
例如:
  /**
  * 定义的方法
  * @param x Int
  * @param y Int
  * @return Boolean
  */
  def isequal(x:Int,y:Int) = x == y

  /**
  * 函数字面量的形式
  */
  val iseq = (x:Any,y:Any) => x == y

  输出都是true。

但是Scala中也提供了判断引用相等的函数,就是eq 和Java的==功能相同,对用的反义词是ne。
例如:

  val t = new String("abc")
  val t2 = new String("abc")
  print(t eq t2)

答案是false。

posted @ 2019-07-11 19:53  Coding_Now  阅读(384)  评论(0编辑  收藏  举报