關於scala中的主建構函式

mo10發表於2020-09-24

在前期scala的學習中我們一般新增變數時採用的是java風格的成員定義方式,例如下面的程式碼。

class Student{
  var name : String = _
}

Scala會生成一個預設的建構函式和Scala風格的SetXXX(public java.lang.String name())和GetXXX(public name_(java.lang.String))。實際上Scala提供了更為簡化的成員變數和建構函式的定義方式,即將成員變數和構造方法交織在一起,例如:

object demo03 {
  def main(args: Array[String]): Unit = {
  }
}
class Person(var name : String,var age : Int){
}

通過對這段程式碼反編譯得到:

E:\WorkSpace\scalaFiles\target\classes\com\mo\chapter06\myconstructor>javap -private Person.class
Compiled from "demo03.scala"
public class com.mo.chapter06.myconstructor.Person {
  private java.lang.String name;
  private int age;
  public java.lang.String name();
  public void name_$eq(java.lang.String);
  public int age();
  public void age_$eq(int);
  public com.mo.chapter06.myconstructor.Person(java.lang.String, int);

可以看到class Person(var name : String,var age : Int)做了一下三件事情:
1.定義了一個類並實現了建構函式Person(var name : String,var age : Int)。
2.定義了name和age成員變數。
3.分別生成了scala風格得Setxxx()和Getxxx()方法。

如果使用java語言來實現class Person(var name : String,var age : Int)同樣功能的話,則需要如下的程式碼。

public class demo04 {
    String name ;
    int age ;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    public demo04(String name,int age){
        this.name = name;
        this.age = age;
    }
}

可以看到scala只用了一行程式碼就是實現了java多行程式碼的功能。
在java語言中,如果希望在建立物件時執行某些動作,則需要在建構函式中新增相應的程式碼,但是在scala中只需要將程式碼直接放在定義的類中,例如:

object demo03 {
  def main(args: Array[String]): Unit = {
    val person = new Person("tom",18)
    //this is a part of constructor~~~
  }
}
class Person(val name :String , val age : Int){
  println("this is a part of constructor~~~")
  //println語句作為主構造器的一部分,在建立物件時被執行。
  override def toString: String = name + " " + age
}

注意在上面的程式碼中,在Person類體中放置了一個println語句,在條語句便會作為主構造器的一部分,在建立物件時被執行,它相當於下面的java程式碼。

public class demo04 {
    public static void main(String[] args) {
        new demo04("tom" , 18);
    }
    String name ;
    int age ;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    public demo04(String name,int age){
        System.out.println("this is a part of constructor~~~");
        this.name = name;
        this.age = age;
    }
}

注意:
**

  1. Scala構造器作用是完成對新物件的初始化,構造器沒有返回值。
  2. 主構造器的宣告直接放置於類名之後。
  3. 主構造器會執行類定義中的所有語句(把類中寫的語句放入到主構造器),這裡可以體會到Scala的函數語言程式設計和麵向物件程式設計融合在一起,即:構造器也是方法(函式),傳遞引數和使用方法和前面的函式部分內容沒有區別。**

相關文章