17scala中访问控制与方法重写

35 阅读2分钟

(一)private

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

格式:

class 类名{
       private 属性
       private 方法} 
package level02

object Class02 {
  class Student(val name: String, val age: Int) {
    // private: 私有的。不对外公布,不对外发布,在外面不可以访问。在家之外的地方,不可以被别人知道....
    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[类]

println("s".getClass())
println(p1.isInstanceof[Person])

package level02

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

image.png

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

[讲授]

方法1: 对象.getClass()

方法2:对象.isInstanceof[类]

[编码示例]

println("s".getClass())
println(p1.isInstanceof[Person])

 

(二)重写toString****

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

2.定义toString方法

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

override def toString: String = {

    s"Person(name: name,age:name, age: age)"

  }

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@2133c8f8
  val stu2 = new Student("小明", 18) // level02.Class04$Student@2133c8f8
  println(stu1) // 姓名: 小花
  println(stu2) // 姓名: 小明
}
}

image.png

(四)判断两个对象是相等的?

两个对象做比较==时,会自动调用equals方法。我们可以重写equals方法,并自己定义两个对象相等的标准。

重写equals方法的语法格式:

override def equals(obj: Any): Boolean = {

     true/false  
    if (obj == null || obj.getClass != this.getClass) return false

    // 类型转换和字段比较

    val other = obj.asInstanceOf[Student]

    (this.ID == other.ID) && (this.name == other.name)

}
package level02

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("202401001", "小花", 18)
    val stu2 = new Student("202401001", "小花", 19)
    if (stu1 == stu2) {
      println("他们是同一个人")
    } else {
      println("不是同一个人")
    }

    // println(stu1 == stu2) // false
  }
}

image.png