17.辅助构造器和类的方法

35 阅读2分钟

辅助构造器

package level02
class Student(val name:String,val age:Int) {
  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()
  }
}
辅助构造器被调用了...
我是小花,我今年18
我是未知的,我今年18
我是未知的,我今年20

hobbies用法与private

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

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

package level02

object class03 {
//  判断类和对象的关系? 亲子鉴定?
  
//  方式1: 对象.getClass()     // 找爹
//  方式2: 对象.isInstanceof[类]  // DNA对比
  class Student(){}
  class Teacher(){}

  def main(args: Array[String]): Unit = {
    val age :Int = 1
    val stu = new Student()
//    stu 是对象名
//    Student 是类名
//    stu是Student类的实例。
//    stu.getClass
    //  返回类名
    println(stu.getClass)
    println(age.getClass)

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

    println(stu.isInstanceOf[Teacher])// False
  }
}
运行结果:
class level02.class03$Student
int
true
false

目标: 改进类的代码,让它在println的时候,输出的信息更友好一点!

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

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},年龄:${age}"
  }

  def main(args: Array[String]): Unit = {
    val stu1 = new Student("小花",18)
    val stu2 = new Student("小明",18)
    println(stu1)// 姓名:小花
    println(stu2)// 姓名:小明
  }
}

目标:判断两个Student对象是相等的依据是:学号相同 并且 姓名相同

// 改写 equals 方法
// 在使用 == 判断的时候,会自动调用。
//    如果返回true ,则相等
//    如果返回是false ,则不相等
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("20240010","小花",18)
    val  stu2 = new Student("20240010","小花",19)

    if (stu1 == stu2){
      println("他们是同一个人")
    }else{
      println("不是同一个人")
    }
  }
}

链式

arr1.map(x => 2*x).filter(x=>x>5).foreach(println())
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())
  }
}
结果:
sayhi
sayHello