scala中访问控制与方法重写

44 阅读2分钟

private

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

格式

| class 类名{private 属性private 方法} |

class Student(){
  private val name:String;
}
object Test{
  def main(args: Array[String]): Unit = {
    val s = new Stuent()  
s.name // 错误
  }

判断类和对象的关系

方式一:对象.getClass()//找爹

方式二:对象.isInstanceof[类]//DNA对比

package txy

object Demo1 {
class Stu(){}
  class Tea

  def main(args: Array[String]): Unit = {
    val st = new Stu()
    val age:Int = 10
    println(st.getClass)
    println(age.getClass)
    //返回类名
    println(st.isInstanceOf[Stu])
    println(st.isInstanceOf[Tea])
    //返回boolean值
  }
}

重写toString

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

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

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

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

定义toString方法:

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

package txy

object Demo2 {
  class Stu(var name:String, age:Int) {
    override def toString: String = s"姓名:${name},年龄:${age}"
    //override:重写,覆盖
    //toString:每个对象自带的方法,println时自动被调用并返回一个字符串,就是输出的内容
  }

  def main(args: Array[String]): Unit = {
    val st = new Stu("mjq",18)
    println(st)
  }
}

如何判断两个对象是相等的

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

package txy

object Demo3 {
class Stu(val id:Int,val name:String,val age:Int) {
  //使用equals方法
  //在使用==判断的时候会自动调用
  //返回true则相等,false则不等
  override def equals(obj:Any):Boolean = {
    println(s"比较是否相等.... ${this.id},${this.name},")
    val other = obj.asInstanceOf[Stu]
     this.id == other.id && this.name == other.name
  }
}

  def main(args: Array[String]): Unit = {
    val s1 = new Stu(10001,"马嘉祺",18)
    val s2 = new Stu(10001,"马嘉祺",19)
    if(s1 == s2){
      println("是同一人")
    }else{
      println("不是同一人")
    }
  }
}

链式

实现要点:把当前返回值设置为当前对象:

链式调用:.方法.方法.方法

package txy
class Stu() {
  def s1(): Stu = {
    println(1)
    this
  }
  def s2(): Stu = {
    println(2)
    this
  }
  def s4():Stu={
    println(4)
    this
  }
  def s5():Stu={
    println(5)
    this
  }
  def s6():Stu={
    println(6)
    this
  }
  def s7():Stu={
    println(7)
    this
  }
  def s8():Stu={
    println(8)
    this
  }
  def s9():Stu={
    println(9)
    this
  }
}
object Demo4 {
  def main(args: Array[String]): Unit = {
    val s = new Stu()
      s.s1.s2.s4.s5.s6.s7.s8.s9

  }
}