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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM