1、基本語法:
構造器分為主構造器和輔助構造器
class 類名(形參列表) { // 主構造器 // 類體 def this(形參列表) { // 輔助構造器 } def this(形參列表) { //輔助構造器可以有多個... } } //1. 輔助構造器 函數的名稱this, 可以有多個,編譯器通過不同參數來區分 |
2、主構造器
class Person(val age:Int,var name:String, sex:Int, score1:Int) { |
執行結果:
反編譯:
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) {
|
運行結果:
輔助構造器的名稱為this,多個輔助構造器通過不同的參數列表進行區分,也就是重載
4、Bean屬性
將scala字段添加@BeanProperty就會生成同java類似的get和set方法
import scala.beans.BeanProperty
|
反編譯結果
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方法