主构造函数和辅助构造函数,对象的使用

12 阅读2分钟
package level02
//class类
//var 修饰时的属性可以被修改
//val 修饰时的属性不可以被修改
//1 主构造函数 class Student()
//2 辅助构造函数,提供更多的的来创建对象
class Student(var name:String,val age:Int) {
  println("Student.......")
  //辅助构造函数
  //特点:1. 名字就是this 2. 第一句代码就是调用主构造器
  def this() = {
    this("未知的",18)//调用主构造器
    println("辅助构造器被调用了...")
  }
  def this(age:Int)={
    this("未知的",age)
  }
  def sayHi():Unit = {
    println(s"我是${name},我今年${age}")
  }
}
object Class01 {
  def main(args: Array[String]): Unit = {
    //创建对象,new 会自动调用构造函数
    val stu1 = new Student("小花",18)
    val stu2 = new Student()
    val stu3 = new Student(20)
    //调用对象的方法
    stu1.sayHi()
    stu2.sayHi()
    stu3.sayHi()
    //修改对象的属性
    stu1.name = "小花花"
    //调用对象的方法
    stu1.sayHi()
  }
}

private

类的内部,使用的私有方法;类的外部,无法访问私有属性

package level02

object Class02 {
  class Student(var 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]): Unit = {
    val stu = new Student("小花",18)
    stu.sayHi()
    //println(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)
    println(stu.isInstanceOf[Student])
    println(stu.isInstanceOf[Teacher])
  }
}
package level02

object Class04 {
  //目标:改进类的代码,让它在println的时候,输出的信息更友好一点
  //重写 toString方法
  //(1) override 重写,覆盖
  //(2) toString 方法,是每个对象都会自带的一个方法,当使用println时,他会被自动调用,返回一个字符串,就是输出的内容
  class Student(var name:String,val 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)

  }
}

改写equals方法

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

package level02

object Class05 {
  //判断两个student对象是否相互相等的依据是:学号相同且姓名相同
  class Student(val id : String,var name:String,val age:Int) {
    //改写equals方法
    //在使用==判断的时候,会自动调用
    //如果返回true,则相等
    //如果返回false,则不相等
    override def equals(obj:Any):Boolean = {
      println(s"比较是否相等.....${this.id},${this.name},")//this是指当前对象
      //判断逻辑
      //把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","小花",18)
    if(stu1 == stu2){
      println("他们是同一个人")
    }else{
      println("他们不是同一个人")
    }
  }
}
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)
  }
}