scala构造器的学习

64 阅读3分钟

构造器是一个函数,在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