构造函数

58 阅读2分钟

辅助构造函数

package level02

class Student(var name: String, val age: Int) {
  println("Student........")
  // 辅助构造函数
  // 特点:1. 名字就是this 2. 第一行代码就是调用主构造器
  def this() = {
    this("未知的", 18) // 调用主构造函数
    println("辅助构造器被调用了...")
  }

  def this(age: Int) = {
    this("未知的", age)
  }

  def sayHi(): Unit = {
    println(s"我是${name},我今年${age}")
  }
}

object Class01 {
  def main(args: Array[String]): Unit = {
    // 创建对象。 new 会自动调用构造函数
    val stu1 = new Student("小花", 18)
    val stu2 = new Student()
    val stu3 = new Student(20)
    // 调用对象的方法
    stu1.sayHi()
    // 调用对象的方法
    stu2.sayHi()
    stu3.sayHi()
  }
}

构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。

new Class() 就是在调用构造器,或者叫调用构造函数。

在scala中,直接在定义类时,补充参数即可。


package level02

object Class02 {
  class Student(val name: String, val age: Int) {
    private val hobbies: String = "躲在被子,打手电看恐怖小说"

    private def hobby(): Unit = {
      println(s"${hobbies}")
    }

    def sayHi(): Unit = {
      println(s"${name}, ${age}")
      hobby()
    }
  }

  def main(args: Array[String]): Unit = {
    val stu = new Student("小花", 18)
    stu.sayHi()
  }
}
package level02

object Class03 {
//判断类和对象的关系
  class Student() {}
  class Teacher() {}

  def main(args: Array[String]): Unit = {
    val age: Int = 1

    val stu = new Student()
//stu是对象名
//student是类名
    println(stu.getClass)
    println(age.getClass)

    println(stu.isInstanceOf[Student])
    println(stu.isInstanceOf[Teacher]) 
  }
}

类可以有自己的行为,scala中也可以通过定义成员方法来定义类的行为。

package level02

object Class04 {
  // 目标:改进类的代码,让它在println的时候,输出的信息更友好一点!
  // 重写 toString方法
  // (1) override 重写,覆盖....
  // (2) toString 方法,是每个对象都会自带的一个方法,当我们使用println
  class Student(var name: String, var age: Int) {
    override def toString: String = s"姓名:${name}"
  }

  def main(args: Array[String]): Unit = {
    val stu1 = new Student("小花", 18) // level02.Class04$Student
    val stu2 = new Student("小明", 18) // level02.Class04$Student
    println(stu1) // 姓名:小花
    println(stu2) // 姓名:小明
  }
}
object Class05 {
  // 目标:判断两个Student对象是否相等的依据是:学号相同 并且 姓名相同
  //      这里的判断条件可以自己来确定

  class Student(val id: String, val name: String, val age: Int) {
    // 改写 equals 方法
    // 在使用 == 判断的时候,会自动调用。
    // 如果返回true,则相等
    // 如果返回false,则不相等
    override def equals(obj: Any): Boolean = {
      println(s"比较是否相等..... ${this.id},${this.name},")
      // 在这里写自己判断逻辑
      // 把obj当做Student
      val other = obj.asInstanceOf[Student]

      this.id == other.id && this.name == other.name
    }
  }

  def main(args: Array[String]): Unit = {
    val stu1 = new Student("2024101001", "小花", 18)
    val stu2 = new Student("2024101001", "小花", 19)
    if (stu1 == stu2) {
      println("他们是同一个人")
    } else {
      println("不是同一个人")
    }
    // println(stu1 == stu2) // false
  }
}

链式调用

package level02

object Class06 {
  // 链式
  //   arr1.map(x => 2*x).filter(x=>x>5).foreach(println)

  // 实现要点:把当前方法的返回值设置为当前对象!
  class Student() {
    def sayHi(): Student = {
      println("sayhi")
      this
    }

    def sayHello(): Student = {
      println("sayHello")
      this // 返回当前对象
    }
  }

  def main(args: Array[String]): Unit = {
    val stu1 = new Student()
    // 链式调用。方法.方法.方法......
    stu1.sayHi().sayHello()

    // val arr1 = Array(1,2,3)
    // arr1.map(x => 2*x).filter(x=>x>5).foreach(println)
  }
}