构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。
new Class() 就是在调用构造器,或者叫调用构造函数。
// 带参数的构造器(构造函数)
class Student(var name:String = "小花",var age:Int = 20) {
// 方法
// 定义方法和定义函数一致
def sayHello(): Unit = {
println(s"我是${age}岁的${name}")
}
}
def main(args: Array[String]) = {
// new Student()
// 1.调用构造器,第五行
// 2.没有传入相关的参数,使用默认值
val st1 = new Student()
println(st1.name)
// new Student(“小明”,19)
// 1.调用构造器,第五行
// 2.传入相关的参数
val st2 = new Student("小明",19)
println(st2.name)
三角形案例
封装一个三角形类,给中学生使用,能根据三条边的信息。
求三角形的面积
// 面向对象编程的三个特点
// 封装,继承,多态
class Triangle(a:Double,b:Double,c:Double) {
// 计算面积
def getAera():Double= {
// 能否根据三条边长,来计算面积? 海伦公式
if (check()) {
var s = (a + b + c) / 2
s = (s * (s - a) * (s - b) * (s - c))
return Math.sqrt(s) // Math.sqrt(4)==> 2 就是开平方操作
}else{
print("不能构造三角形")
return 0;
}
}
// 检查是否能构成三角形
def check():Boolean = {
// 任意之和大于第三边
return (a+b)>c && (a+c)>b && (b+c)>a
}
}
def main(args: Array[String]) = {
// Triangle表示一个三角形类
//Trianle(边长1,边长2,边长3)
val t1 = new Triangle(3,4,5)
println(t1.getAera()) //获取面积
val t2 = new Triangle(1,1,3)
println(t2.getAera()) //获取面积
}
构造器的参数修饰符
//可以在两个地方写属性
// 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]) = {
val t = new Triangle(1,2,3)
t.b = 2
// t.c 无法访问
}
辅助构造器的作用
1. 提供多种初始化方式:
辅助构造器允许类提供多种初始化选项,使得创建对象时更加灵活。
2.简化对象创建:
通过定义多个辅助构造器,您可以简化对象的创建过程,避免在主构造器中处理过多的参数。
3.调用主构造器:
辅助构造器可以通过 this 关键字调用主构造器,从而确保所有初始化逻辑都集中在主构造器中。
写多个构造器
主构造器:一个,就是 class
辅构造器:
1.多个,名称就是 this
2.在内部必须要调用一次主构造器
构造器的作用:生产对象
支持多种创建对象的方式 ==== 在网站在注册用户时,可以有多种注册方式:手机号,微信号,邮箱号
// 主构造器
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]) = {
var u1 = new User("123456789","12345")
var u2 = new User("123456@qq.com","小花","12345")
var u3 = new User("123456@qq.com","小花","12345","123454321")
u3.say()
}
结果:
我的信息如下:
姓名:小花
手机号:123454321
邮箱:123456@qq.com
密码:12345