scala中访问控制与方法重写

35 阅读1分钟

一、private

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

屏幕截图 2025-11-09 170819.png

package level02

object class02 {
  // private:私人的,私有的
  // private 修饰之后,它就是私有的,在类的外部无法被访问。只能在类的内部被访问
  class Student(var name:String,var age:Int){

    // 私有属性
    private val phoneNum:String="136XXXXXX"

    // 私有方法
    private def hobby():Unit={
      println(s"我的个人爱好是隐私信息.....${phoneNum}")
    }

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

      hobby() // 在类的内部,可以访问私有成员
    }
  }


  def main(args: Array[String]): Unit = {
    // 实例化类的对象 stu
    // new 的时候,就会自动调用一次构造函数
    val stu =new Student("小花",18)
    // 调用对象的方法
    stu.sayHello()

  }

}

二、重写toString

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

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

package level02

object class03 {
  // 目标:让对象被打印的时候,输出信息更友好些
  // 做法:重写 toString方法
  // 在使用println输出一个对象的时候,它会自动调用toString方法,并输出这个方法的返回值
  class Student(var name:String,var age:Int) {
    override def toString: String = s"Student(${name},${age})"
  }
  def main(args: Array[String]): Unit = {
    // 实例化类的对象 stu
    // new 的时候,就会自动调用一次构造函数
    val stu1 = new Student("小花", 18)
    val stu2 = new Student("小明", 19)
    // 打印输出一个对象,输出的信息不友好
    // level02.class03$Student@2133c8f8
    // level02.class03$Student@43a25848
    println(stu1)
    println(stu2)
  }
}

三、判断两个对象是相等的

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

class student(var name:String,var id:String,var age:Int) {
  //equals相等
  override def equals(obj: Any): Boolean = {
    println("调用了equals")
    println(this, obj)
    // 判断this和obj是否相等的逻辑:姓名和学号都相等,说明这两个学生是同一个人
    val other = obj.asInstanceOf[student]
    this.name == other.name && this.id == other.id
  }
}
def main(args: Array[String]): Unit = {
  val stu1=new student("小花","20230012",18)
  val stu2=new student("小花","20230012",18)
  val stu3=new student("小花","20230013",18)
  // 目标:判断他们是一个人。 使用== 来输出的时候,应该要是true
  println(stu1==stu2) //true
  println(stu1==stu3) //false
}