类和对象

27 阅读2分钟

建筑构造函数,提供更多的方式来创建对象

//var 修饰的属性可以被修改
//val 修饰的属性不可以被修改
//student()构造函数(构造器),用来创建对象
//1· 主构造 class Student
//2· 铺筑构造函数,提供更多的方式来创建对象

class Student(var name:String,var age:Int) {
  println("student.....")
  //铺筑构造函数
  // 特点1·名字就是this 2·第一句代码就是主构造器
  def this(age:Int)={
    this("未知的",age)
  }
  def sayHi():Unit={
    println(s"我是${name},我今年${age}")
  }
}
object w27 {
  def main(args: Array[String]): Unit = {
    val stu = new Student("小花",18)

    val stu3 = new Student(20)
    stu.sayHi()
    stu.name="小花花"
    stu3.sayHi()
  }


}

private:私有的。不对外发布,在外面不可以访问。在家之外的地方,不可以被别人知道

object w29 {
  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]) = {
      val stu = new Student("小花",18)
      stu.sayHi()
    }
  }

判断类和对象的关系?亲子鉴定?

object w30 {
  //判断类和对象的关系?亲子鉴定?


  //方式1:对象.getClass()      //找爹
  //方式2:对象.isInstanceof[类] //DNA对比
  class Student(){}
  class Teacher(){}
  def main(args: Array[String]) = {

      val age:Int = 1

      val stu = new Student()
      //stu 是对象名
      //student是类名
      //stu是student类的实例


      //返回类名
      println(stu.getClass)//class w30$Student
      println(age.getClass)//int
      //注意:[],结果是boolean值

      println(stu.isInstanceOf[Student])//true

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

改进类的代码,让它在println的时候,输出的信息更友好一点!

object w31 {
  //目标:改进类的代码,让它在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]) = {
      val stu1 = new Student("小花",18)//w31$Student@4c203ea1
      val stu2 = new Student("小明",18)
      println(stu1)//姓名:小花
      println(stu2)//姓名:小明
    }
  }

判断两个Student对象是否相等的依据是:学号相等 并且 姓名相同

object w32 {
  //目标:判断两个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]) = {
    val stu1 = new Student("20240000","小花", 18)
    val stu2 = new Student("20249999","小花", 18)
    if (stu1==stu2){
      println("他们是同一个人")
    }else{
      println("不是同一个人")
    }
    //println(stu1 == stu2)//false

    }
  }

把当前方法的返回值设置为当前对象!

object w33 {
  // 链式
  // 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)
  }
}