scala类和对象

22 阅读1分钟
package level02

class Student(var name: String, val age: Int) {
  println("Student......")
  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 = {
    val stu1=new Student("小花",18)
    val stu2=new Student()
    val stu3=new Student(20)
    stu1.sayHi()
    stu2.sayHi()
    stu3.sayHi()

  }
}
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()
    // println(stu.hobbies)
    // stu.hobby() // 在类的外部,无法访问私有属性
  }
}

判断类和对象的关系? 亲子鉴定?

方式1:对象.getClass()
方式2:对象.isInstanceOf[类]

package level02

object Class03 {
  class Student() {}
  class Teacher() {}

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

    val stu = new Student()
    // stu 是对象名
    // Student是类名
    // stu是Student类的实例。

    // 返回类名
    println(stu.getClass) // class level02.Class03$Student
    println(age.getClass) // int

    // 注意:[] 结果是boolean值
    println(stu.isInstanceOf[Student]) // true
    println(stu.isInstanceOf[Teacher]) // false
  }
}

重写 toString方法

(1) override 重写,覆盖.....
(2) toString 方法,是每个对象都会自带的一个方法,当我们使用println时,它就会自动被调用,返回一个字符串,就是输出的内容。

package level02

object Class04 {
  // 目标:改进类的代码,让它在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)
    val stu2 = new Student("小明", 18)

    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)
  }
}