一:介绍
在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。