scala类和对象

42 阅读2分钟

class 类

类是属性行为的集合

  1. 属性也叫成员变量:名词,用来描述事物的外在特征
  2. 行为也叫成员方法:动词,表示事物能做什么
  3. 在Scala中,用class来创建类,用new来创建对象

this关键字链式风格

格式:对象.方法1().方法2().方法3()..

辅助构造函数

  • 构造函数可以有多个,其他的叫辅助构造函数 格式
  • 辅助构造器的方法名固定为this,其参数不能使用var或val修饰,且必须在第一行代码中直接或间接调用主构造器
// 类是属性的集合
// Student. 构造函数用来创建对象的
// 辅助构造函数,提供多种创建对象的方式
class Student(var name: String, var age: Int) {
  println("构造函数被调用...")

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

  // 辅助构造函数
  // (1)它的名字就是this
  // (2) 它内部的第一句代码就必须是调用 主构造函数 this("无名氏",0)
  def this() = {
    this("无名氏", 0)
    println("辅助构造函数1被调用...")
  }

  def this(name: String) = {
    this(name, 0)
    println("辅助构造函数2被调用...")
  }
}

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

    // 这里没有设置参数。它会调用辅助构造函数
    // val stu2 = new Student()
    // stu2.sayHi()

    // 这里设置了一个参数。它会调用辅助构造函数
    val stu3 = new Student("小明")
    stu3.sayHi()
  }
}
object run5 {
  //私有
  class Student(var name: String, var age: Int ){

    //在方法前面添加private 那这个方法是是私有的,class的外部被访问
    private def song(): Unit = {
      println("我在唱歌.....")
    }

    def sayHi(): Unit = {
      println(s"我是${name}, 我今年${age}")
      //私有方法,在类的内部是可以正常调用的
      song()
    }
  }


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

    val stu3 = new Student("小明", 18)
    stu3.sayHi()
    //stu3.song() //会报错

  }
}
  • object 对象
  • 单例对象,直接使用object来定义。 不能用new
  • 单例对象,只有一个,不能通过new来生成多个。它一般用来存放工具方法,常理...
package level02

object  class03 {
  val PI=3.1415

  def doubleN(n:Int):Int={
    n*2
  }
}

object basic60 {
  def main(args:Array[String]):Unit={
    val rst =Tools.PI * Tools.doubleN(2)//12.56
    println(s"rst=${rst}")
  }

}

定义Student类

package level02

object class04 {
  // 定义Student类,包含id、name、age三个属性
  class Student(val id: String, val name: String, val age: Int) {
    // 重写equals方法,自定义对象相等的判断逻辑
    override def equals(obj: Any): Boolean = {
      println(s"比较是否相等..... ${this.id},${this.name}")
      // 检查obj是否为Student类型
      obj match {
        case other: Student =>
          // 当学号和姓名都相同时,认为两个对象相等
          this.id == other.id && this.name == other.name
        case _ =>
          // 非Student类型对象直接返回不相等

      }      false
      }
    }
  }

  def main(args: Array[String]): Unit = {
    // 创建两个Student实例,学号和姓名相同,年龄不同
    val stu1 = new Student("2024101001", "小花", 18)
    val stu2 = new Student("2024101001", "小花", 19)

    // 使用==进行比较(会自动调用重写的equals方法)
    if (stu1 == stu2) {
      println("他们是同一个人")
    } else {
      println("不是同一个人")
    }
  }
  }