一、构造器

### --- 构造器

~~~ 如果没有定义构造器,Scala类中会有一个默认的无参构造器;
~~~ Scala当中类的构造器分为两种:主构造器和辅助构造器;
~~~ 主构造器的定义与类的定义交织在一起,将主构造器的参数直接放在类名之后。
~~~ 当主构造器的参数不用var或val修饰时,参数会生成类的私有val成员。
~~~ Scala中,所有的辅助构造器都必须调用另外一个构造器,另外一个构造器可以是辅助构造器,也可以是主构造器。
### --- 编程示例

//主构造器直接定义在类中,其代码不包含在任何方法中
//Scala中的主构造器与类名交织在一起,类名后面的参数即为主构造器的参数
class Dog(name: String, age: Int) {
//类中不在任何方法中的代码,都属于主构造器的代码。
//创建类的对象时会去执行主构造器的代码。下面的println代码就是主构造器的一部分
println(name)
println(age)
var gender: String = ""
def this(name: String, age: Int, gender: String) {
//每个辅助构造器,都必须以其他辅助构造器,或者主构造器的调用作为第一句代码
this(name, age)
this.gender = gender
}
var color = ""
def this(name: String, age: Int, gender: String, color: String) {
//调用上面的辅助构造器
this(name, age, gender)
this.color = color
}
}
object Dog {
def main(args: Array[String]): Unit = {
val dog1=new Dog("狗蛋",4)
val dog2=new Dog("旺才",3,"雄性")
val dog3=new Dog("小六",5,"雄性","黑色")
}
}

二、编程实现

### --- 编程代码

package yanqi.cn.part04

//主构造器与类名交织在一起,类名后面的参数就是主构造器的参数
//主构造器直接在类中,其代码不包含在任何方法中
class Animal(name: String, age: Int) {
//下面三行println代码都属于主构造器的代码
println(name)
println(age)
println("=========================")

var gender: String = ""

def this(name: String, age: Int, gender: String) {
//每个辅助构造器必须以主构造器或其他辅助构造器的调用作为第一句代码
this(name, age)
this.gender = gender
}

var color: String = ""

def this(name: String, age: Int, gender: String, color: String) {
//此处调用的是上面的辅助构造器
this(name, age, gender)
this.color = color
}
}

object ConstructorDemo {
def main(args: Array[String]): Unit = {
val animal = new Animal("狗蛋", 4)
val animal2 = new Animal("旺才", 3, "雄性")
val animal3 = new Animal("小六", 5, "雄性", "黑色")
}
}
### --- 编译打印

D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=55671:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part04.ConstructorDemo
狗蛋
4
=========================
旺才
3
=========================
小六
5
=========================

Process finished with exit code 0

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart

                                                                                                                                                   ——W.S.Landor