- 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 ......") } }