Scala_クラス#クラス#

3976 ワード

一、クラスの基本要素
  class Counter{
    private var value = 0   //       
    def increment() { value += 1}   //     ,      
    def current() = value
  }

二、私有変数ScalaはJVM向けのクラスを生成し、その中に私有のageフィールドと相応のgetterとsetter方法がある.この2つの方法は、ageをprivateとして宣言していないため、共通です(プライベートフィールドではgetterメソッドとsetterメソッドもプライベートです).getterとsetterはそれぞれageとage_=と呼ばれます.いつでもgetterメソッドとsetterメソッドを自分で再定義できます.フィールドがvalの場合、getterメソッドのみが生成されます.getterまたはsetterが不要な場合は、フィールドをprivateとして宣言できます[this]
  class Person{
    private var privateAge = 0   //        
    def age= privateAge
    def age_= (newValue: Int): Unit ={
      if (newValue > privateAge) privateAge = newValue
    }
    val timeStamp = new java.util.Date    //   getter     
    private[this] var value= 0  //       .value           
  }
  val person = new Person
  person.age_=(24)
  println(person.age)   // 24
  person.age_=(13)
  println(person.age)   // 24

三、@BeanPropertyで修飾すると、name:String name_=の4つのメソッドが自動的に生成されます.(newValue: String): Unit getName(): String setName(newValue: String): Unit
  class Person2{
    @BeanProperty var name:String = _
  }

四、主コンストラクタはクラス定義とインターリーブされている.クラス名の後にパラメータがない場合、クラスはパラメトリックマスターコンストラクタを備えます.このようなコンストラクタは、クラス内のすべての文を単純に実行するだけです.通常、プライマリコンストラクタでデフォルトのパラメータを使用することで、アシスト構造を過度に使用することを回避できます.
  class Person4 (val name: String, val age: Int){
    //class Person4 private (val name: String, val age: Int){   private                   ,                 
    printf("My name is %s, And my age is %d", name, age)     //                     
    private var value = 0   //       
    def increment() { value += 1}   //     ,      
    def current() = value
  }
  val person4 = new Person4("regan", 24)   //         
  println(person4.current)

五、補助コンストラクタ補助コンストラクタの名前はthisです.各アシストコンストラクタは、以前に定義された他のアシストコンストラクタまたはプライマリコンストラクタへの呼び出しで開始する必要があります.
  class Person3{

    private var name = ""
    private var age = 0

    def this(name: String){     //        
      this    //       
      this.name = name
    }
    def this(name:String, age:Int){   //         
      this
      this.name = name
      this.age = age
    }
  }
  val person3_1 = new Person3    //     
  val person3_2 = new Person3("regan")   //         
  val person3_3 = new Person3("regan", 24)   //        

六、入れ子類
  class Network {
    class Member(val name: String) {
      val contacts = new ArrayBuffer[Member]
    }
    private val members = new ArrayBuffer[Member]
    def join(name: String) = {
      val m = new Member(name)
      members += m
      m
    }
  }
  val chatter = new Network
  //            ,      new    :new chatter.Member。  Java ,           :chatter.new Member()。
  val fred = chatter.join("Fred")
  val wilma = chatter.join("Wilma")
  fred.contacts += wilma // OK

七、列挙は拡張Enumerationクラスのオブジェクトを定義し、初期化列挙のすべてのオプション値をvalueメソッドで呼び出す.Valueメソッドを呼び出すたびに、内部クラスの新しいインスタンスが返されます.この内部クラスはValueとも呼ばれます.または、ValueメソッドにID、名前、または2つのパラメータを入力することもできます.指定しない場合、IDは前の列挙値に1を加え、ゼロから開始します.デフォルト名はフィールド名です.列挙値のIDはidメソッドで返すことができ、名前はtoStringメソッドで返すことができる.
  object TrafficLightColor extends Enumeration {
    val Yellow, Green= Value
    val Red= Value(0, "Stop")
  }

八、拡張クラス:extendsはクラスをfinalと宣言することができ、それによって拡張できない.単一のメソッドまたはフィールドをfinalとして宣言することもできます.Scalaで非抽象メソッドを書き換えるにはoverride修飾子を使用してScalaでスーパークラスを呼び出す必要がありますJavaと同じようにsuperキーワードを使用します
 class Employee extends App{
    final val age:Int = 1
  }
  //       :                ,   islnstanceOf  。       ,    aslnstanceOf             

フィールドまたはメソッドをprotectedとして宣言できます.このようなメンバーは、任意のサブクラスにアクセスできますが、他の場所から見ることはできません.Scalaはまたprotected[this]の変体を提供し、アクセス権限を現在のオブジェクトにabstractキーワードでインスタンス化できないクラスをマークすることができるようにした.通常、これは、ある方法またはいくつかの方法が抽象方法以外に完全に定義されていないためである.クラスは抽象フィールドを持つことができる.抽象フィールドは初期値のないフィールドである.