1.主构造器
2.1 定义:在 Scala 中,主构造器是类定义的一部分,它与类的声明紧密结合,用于初始化类的实例。主构造器的参数直接定义在类名后面,并且可以直接在类体中使用。
2.2 主构造器的特点:
(1) 参数作用域:主构造器的参数可以在整个类体中使用
(2) 访问修饰符:可以为参数添加 val 或 var 关键字,使其成为类的字段
-
val:不可变字段(只读) -
var:可变字段(可读可写) -
不加修饰符:只能在类内部使用,不会成为类的字段
例子:
object basic25 {
// 带参数的构造器(构造函数)
class Student(var name:String ="小花",var age:Int=18){
// 方法
// 定义方法和定义函数一致
def sayHello(): Unit ={
println(s"我是${age} 岁的${name}")
}
}
def main(args: Array[String]): Unit = {
// new Student()
// 1. 调用构造器,第五行 。
// 2. 没有传入相关参数,使用默认值。
val st1=new Student()
println(st1.name)
//new Student("小明",19)
//1. 调用构造器,第五行 。
// 2. 没有传入相关参数。
val st2=new Student("小明",19)
println(st2.name)
}
}
辅构造器
1. 定义:在 Scala 中,除了主构造器之外,还可以定义辅助构造器(Auxiliary Constructor),用于提供类的多种实例化方式。辅助构造器通过 this 关键字定义,并且必须直接或间接调用主构造器。
2.下面是一个包含主构造器和多个辅构造器的类示例:
// 构造器的参数修饰符
object basic26 {
// 可以在两个地方写属性
// 1.构造器的参数列表
// 2.构造器内部
//
//
// 构造器的参数列表
// 1. val 表示不可以被修改的参数
// 2. var 表示可以被修改的参数
// 3. 没有修饰符,不是对象的属性,无法访问。
class Triangle(val a:Double,var b:Double,c:Double) {
val d:Int=1
var e:Int=2
}
def main(args: Array[String]): Unit = {
val t=new Triangle(1,2,3)
t.b=2
// t.c无法访问
}
}
object basic27 {
/**
* 写个构造器
* 主构造器: 一个,就是class
* 辅构造器: 多个, 名称就是this
* 构造器的作用: 生产对象
* 支持多种创建对象的方式 === 在网站在注册用户时, 可以有多种注册方法: 手机号, 微信号, 邮箱号
*
* @param args
*/
class User(val phone:String,var pwd:String) {
var email:String =""
var name:String =""
def this (email:String,name:String,pwd:String){
// 调用一次主构造器
this("",pwd)
// 再对其他属性赋值
this.name = name
this.email = email
}
// 辅构造器
def this (email:String,name:String,pwd:String,phone:String){
// 调用一次主构造器
this(phone,pwd)
// 再对其他属性赋值
this.name = name
this.email = email
}
def say():Unit={
println(s"我的信息如下:")
println(s"姓名:${name} ")
println(s"手机号:${phone}")
println(s"邮箱:${email}")
println(s"密码:${pwd}")
}
}
def main(args: Array[String]): Unit = {
var u1=new User("13617891234","123456")
u1.say()
var u2=new User("12345@qq.com","小花","123456")
u2.say()
var u3=new User("12345@qq.com","小花","123456","13617891234")
u3.say()
}
}
4.辅构造器的特点
1.1 必须调用其他构造器:每个辅构造器的第一条语句必须是 this(...),用于调用主构造器或其他已定义的辅构造器。
1.2 参数列表不同:辅构造器的参数列表必须与主构造器及其他辅构造器不同(参数数量或类型不同),以实现重载。
1.3 不能直接定义字段:辅构造器不能像主构造器那样直接在参数列表中定义字段(如 val 或 var),字段需要在类中显式定义。