关于scala中的主构造函数

在前期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的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别。**
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页