scala中的类和对象

31 阅读3分钟

类class

什么叫类class?

1. 类是属性行为的集合。

(1) 属性也叫成员变量:名词,用来描述事物的外在特征

(2) 行为也叫成员方法:动词,表示事物能做什么

创建类和对象

在Scala中,用class来创建类,用new来创建对象。

定义和访问成员变量。

1. var/val  来定义成员变量

2. 对象可以通过对象名. 成员变量的方式来访问成员变量

定义和访问成员方法

类可以有自己的行为,scala中也可以通过定义成员方法来定义类的行为。

在scala的类中,使用def定义成员方法。

构造器

构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。

new Class() 就是在调用构造器,或者叫调用构造函数。

主构造函数的参数

参数修饰符的三种情况:var 和 val的区别?

1. var 是可以修改的属性

2. val 是不可以修改的属性

3.而没有使用val或者var修饰的,不是属性,不可在外部访问,不可改写。

this关键字链式风格

this在类内部表示当前对象,我们可以利用这个特点实现对象方法的链式调用。

如何实现对象.方法1().方法2().方法3()...

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

原理:在方法中返回this

辅助构造函数

1. 构造函数(构造器)的作用是什么? 创建对象。

2. 构造函数只能有一个吗? 可以有多个。可以有很多个,其他的叫辅助构造函数。

3.格式:

辅助构造器的方法名固定为this,其参数不能使用var或val修饰,且必须在第一行代码中直接或间接调用主构造器

4.辅助构造器的作用

(1).提供多种初始化方式:

辅助构造器允许类提供多种初始化选项,使得创建对象时更加灵活。

(2).简化对象创建:

通过定义多个辅助构造器,您可以简化对象的创建过程,避免在主构造器中处理过多的参数。

(3).调用主构造器:

辅助构造器可以通过 this 关键字调用主构造器,从而确保所有初始化逻辑都集中在主构造器中。

// class类
//var 修饰的属性是可以被修改的
//val 修饰的属性是只读的,不能被修改

//Student() 构造函数(构造器),用来创建对象

// 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()

    //修改对象的属性
    stu1.name="小花花"

    //修改对象的方法
    stu1.sayHi()
    stu2.sayHi()
    stu3.sayHi()

  }
}
object Class02 {
  class Student(val name:String,var age:Int) {
    // private:私有的。不对外公布,不对外发布,在外面不可以访问。在家之外的地方,不可以被别人知道....
    val hobbies:String="躲在被子,打手电看恐怖小说"
    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() //在类的外部,无法访问私有属性
  }

}