scala中访问控制与方法重写

43 阅读1分钟

private

中文意思是:私人的,私密的

默认情况下,类的属性在可以通过对象.属性名的方式来获取,如果不希望在类的外部被访问,可以用private来修饰。

判断类和对象的关系

当我们拿到一个对象时,如何知道它所属的类呢?

方法1: 对象.getClass()

方法2:对象.isInstanceof

object Class03 {
  //判断类和对象的关系?亲子鉴定?
  //方式1:对象.getClass()
  //方式2:对象.isInstanceof[类]
  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
  }
}

重写toString8

为什么我们在打印类的对象的时候,输出的内容非常不好看?

如果我们希望改进这一点,可以通过重写toString方法来实现。

使用println来输出对象是,他会自动调用toString方法。

在Scala中,要重写一个方法,你需要使用override关键字。对于toString方法,你可以在你的类中定义它,并使用override来指明这是对父类方法的重写。

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

定义toString方法

你可以在类的内部直接定义toString方法。这个方法通常不需要任何参数,并且返回一个String类型的结果。

判断两个对象是相等的?

object Class05 {
//目标:判断两个Student对象是否相等的依据是:学号相同 并且 姓名相同
// 这里的判断条件可以自己来确定
  class Student(val id:String,var name:String, var 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("20240011","小花",19)

    if(stu1==stu2){
      println("他们是同一个人")
    } else {
      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) //链式写法
  }
}