scala中访问控制与方法重写

47 阅读2分钟

创建类和对象

object Main {

// 定义类  
class Person{ }  


  def main(args: Array[String]): Unit = {

    println("Hello world!")

    // 创建对象

    val p = new Person()

    println(p)

  }

}

}
package level01

//class 类
// var 修饰的属性是可以被修改的
//val 修饰的属性是只读的,不能被修改
class Student(var name: String, val age: Int) {
  def sayHi():Unit = {
    println(s"我是${name},我今年${age}")
  }
}

object Class01 {
  def main(args:Array[String]):Unit = {
    //创建对象
    val stu1 = new Student("小花",18)
    //调用对象的方法
    stu1.sayHi()

    stu1.name = "小花花"
  }
}

(一)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"${name},${age}")

    }

    def sayHi(): Unit = {
      println(s"${name},${age}")

      hobby() // 在类的内部,可以调用私有方法
    }
  }

  def main(args: Array[String]): Unit = {
    val stu = new Student("小花", 18)
    stu.sayHi()
    // pruntln(stu,hobbies)
    //stu.hobby()  //在类的外部,无法访问私有属性
  }
}
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)
    println(age.getClass)
    //注意:[],结果是boolean值
    println(stu.isInstanceOf[Student]) // true

    println(stu.isInstanceOf[Teacher]) //false
  }

}
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)
    val stu2 = new Student("小花",18)

    println(stu1)
    println(stu2)
  }

}

(二)判断类和对象的关系

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

方法1: 对象.getClass()

方法2:对象.isInstanceof

package level02

object Class05 {
  //目标:判断两个Student对象是否相等的依据是:学号相同 并且 姓名相同
  class Student(var 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("20240010","小花",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()
    //arr1.map(x => 2 * x).filter(x => x > 5).foreach(println)
  }
}