scala中访问控制与方法重写

25 阅读3分钟

🎈复习:

  • ①.class 类
  • ②.var 修饰的属性是可以被修改的;val 修饰的属性是只读的,不可以被修改
  • ③.student()构造函数(构造器),用来创建对象
  • ④.主构造器class student()
  • ⑤.辅助构造器提供更多方式来创建对象
  • ⑥.辅助构造器特点:1.名字就是this 2.第一句代码就是调用主构造器)
package level02
class Student(var name:String,val age:Int) {
  println("Student....")
  def this()={
    this("未知的",18)
    println("辅助构造器被调用了...")
  }
  def this(age:Int)={
    this("未知的",18)
  }
  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()
    //调用对象的方法
    stu1.sayHi()
    stu2.sayHi()
    stu3.sayHi()
  }
}

🎈private

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

package level02
object Class02 {
  class Student(var 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()//在类的外部,无法访问私有属性
  }

}

🎈判断类和对象的关系

通过getInstanceof 和 getClass方法来获取对象的Class名。判断他们之间的关系

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类的实例。

    // 返回类名
    println(stu.getClass)  // class level02.Class03$Student
    println(age.getClass)  // int

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

🎈重写toString

  • ①.目标:改进类的代码,让他在printl的时候,输出的信息好看一些
  • ②.重写 toString方法: (1)override重写,覆盖.... (2)toString方法,是每个对象都自带的一个方法,当我们使用println时,他就会自动被调用,返回一个字符串,就是输出的内容
package level02
object Class04 {
  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)
    println(stu1)
  }
}

🎈判断两个对象是相等的?

  • ①.目标:判断两个Student对象是否是相同的学生:学号相同 并且 姓名相同( 这里的判断条件可以自己来确定)
  • ②.重写equals方法:在使用 == 判断时,会自动调用;如果返回true,则相等;如果返回false,则不等
package level02

object Class05 {
 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} vs ...")
     // 在这里写自己的逻辑
     //把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("22010601", "小花", 18)
   val stu2 = new Student("22010601", "小花", 19)
   if (stu1 == stu2) {
     println("他们是同一个人")
   } else {
     println("不是同一个人")
   }
   // println(stu1 == stu2) // false
 }
}

🎈 链式调用

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

package level02

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