scala之構造器詳解


 

1、基本語法:

構造器分為主構造器和輔助構造器

class 類名(形參列表) {  // 主構造器

   // 類體

   def  this(形參列表) {  // 輔助構造器

   }

   def  this(形參列表) {  //輔助構造器可以有多個...

   }

}

//1. 輔助構造器 函數的名稱this, 可以有多個,編譯器通過不同參數來區分

2、主構造器

class Person(val age:Int,var name:String, sex:Int, score1:Int) {
  var score = score1
  print("主構造器")
}

object Person{
  def main(args: Array[String]): Unit = {
    new Person(3,"zhangsan",1,88)
  }
}

執行結果:

 

反編譯:

public class Person

{

  private final int age;

  private int score;

 

  public int age() //get

  {

    return this.age;

  }

 

  public String name() //get

  {

    return this.name;

  }

 

  public void name_$eq(String x$1) //set

  {

    this.name = x$1;

  }

 

  public int score() //get

  {

    return this.score;

  }

 

  public void score_$eq(int x$1) //set

  {

    this.score = x$1;

  }

 

  public Person(int age, String name, int sex, int score1)

  {

    this.score = score1;

    Predef..MODULE$.print("Ö÷¹¹ÔìÆ÷");

  }

 

  public static void main(String[] paramArrayOfString)

  {

    Person..MODULE$.main(paramArrayOfString);

  }

}

從上面的代碼和結果可以得:

1、主構造器的聲明直接放在類名后面

2、主構造器會執行所有的代碼,方法定義除外

3、如果主構造無參數,后面的小括號可以省略(簡單,不作證明)

4、如果想讓主構造器私有化,則可以在(參數)前面添加private關鍵字

5、從上面代碼中我們在Person類中有三個變量

被val修飾,則為只讀屬性,會生成一個相當於get的方法(反編譯看)

被var修飾,則為讀寫屬性,會生成一個相當於get和set的方法

沒有被修飾,則是一個局部變量,則不會生成任何方法

其中的sex屬性沒有生產任何的方法,是局部變量,而score是里面定義的變量,朱構造器也會執行,score1是局部變量,也不會生成任何的相關方法。

3、輔助構造器

class Person(val age:Int,var name:String, sex:Int, score1:Int) {
  var score = score1
  println("主構造器")

  def this(age:Int, name:String){
    //輔助構造器必須顯示的調用主構造器,可以通過調用其他輔助構造器間接調用
    this(age,name,21,99)
    print("輔助構造器")
  }
}

object Person{
  def main(args: Array[String]): Unit = {
    new Person(3,"zhangsan")
  }
}

 

運行結果:

 

 

輔助構造器的名稱為this,多個輔助構造器通過不同的參數列表進行區分,也就是重載

4、Bean屬性

       將scala字段添加@BeanProperty就會生成同java類似的get和set方法

import scala.beans.BeanProperty

class Person( val name:String, @BeanProperty var age:Int) {
  print("主構造器")
}

object Person{
  def main(args: Array[String]): Unit = {
    new Person("zhangsan",7)
  }
}

 

反編譯結果

public class Person

{

  private final String name;

 

  public String name()

  {

    return this.name;

  }

 

  public int age()

  {

    return this.age;

  }

 

  public void age_$eq(int x$1)

  {

    this.age = x$1;

  }

 

  public void setAge(int x$1)  //setAge

  {

    this.age = x$1;

  }

 

  public int getAge() //getAge

  {

    return age();

  }

 

  public Person(String name, int age)

  {

    Predef..MODULE$.print("主構造器");

  }

 

  public static void main(String[] paramArrayOfString)

  {

    Person..MODULE$.main(paramArrayOfString);

  }

}

從上面的代碼,可以得出生成了get和set方法,如果是val修飾,則只會有get方法

 


免責聲明!

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



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