在前期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;
}
}
注意:
**
- Scala构造器作用是完成对新对象的初始化,构造器没有返回值。
- 主构造器的声明直接放置于类名之后。
- 主构造器会执行类定义中的所有语句(把类中写的语句放入到主构造器),这里可以体会到Scala的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别。**