创建对象

  1. 基本语法 ```scala val | var 对象名 [:类型] = new 类型()
  1. **2.案例实操**<br />(1val修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值<br />(2var修饰对象,可以修改对象的引用和修改对象的属性值<br />(3)自动推导变量类型不能多态,所以多态需要显示声明
  2. ```scala
  3. class Person {
  4. var name: String = "canglaoshi"
  5. }
  6. object Person {
  7. def main(args: Array[String]): Unit = {
  8. //val修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值
  9. val person = new Person()
  10. person.name = "bobo"
  11. person = new Person() //报错
  12. println(person.name)
  13. }
  14. }

构造器(主构造和辅助构造)

和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。
Scala类的构造器包括:主构造器和辅助构造器

主构造器
image.png

  1. class Student(var name : String, val number : String) {
  2. println("主构造器!")
  3. }

主构造器的参数 会编译成字段 参数声明 不加val或者var 相当于private 从构造器定义在类内部,方法名为this
从构造器必须先调用已经存在的构造器

继承而来的字段不需要加var或者val

  1. class UniversityStudent(name : String, number : String, val major : String) extends Student(name, number) {
  2. ......
  3. }

重写父类的字段或方法 加 override 关键字

  1. class 类名 (形参列表) { //主构造器
  2. //类体
  3. // 辅助构造器 必须用this
  4. def this(形参列表) { //辅助构造器
  5. }
  6. def this(形参列表) { //辅助构造器可以有多个...
  7. }
  8. }

说明
(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数及类型来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法
(3)构造器调用其他另外的构造器,要求被调用构造器必须提前声明。
(4) 辅助构造函数的第一个语句必须为对主构造函数的调用

案例实操
(1)如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略。

  1. class Person {
  2. var name: String = _
  3. var age: Int = _
  4. def this(age: Int) {
  5. this()
  6. this.age = age
  7. println("辅助构造器")
  8. }
  9. def this(age: Int, name: String) {
  10. this(age)
  11. this.name = name
  12. }
  13. println("主构造器")
  14. }
  15. object Person {
  16. def main(args: Array[String]): Unit = {
  17. val person2 = new Person(18)
  18. }
  19. }
  20. 输出
  21. 主构造器
  22. 辅助构造器

构造器参数

1.说明
Scala类的主构造器函数的形参包括三种类型:未用任何修饰、var修饰、val修饰
(1)未用任何修饰符修饰,这个参数就是一个局部变量
(2)var修饰参数,作为类的成员属性使用,可以修改
(3)val修饰参数,作为类只读属性使用,不能修改

对于case class的参数而言,主构造器的参数默认就是val类型的变量

2.案例实操

  1. class Person(name: String, var age: Int, val sex: String) {
  2. }
  3. object Test {
  4. def main(args: Array[String]): Unit = {
  5. var person = new Person("bobo", 18, "男")
  6. //未用任何修饰符修饰,这个参数就是一个局部变量
  7. printf(person.name)
  8. //var修饰参数,作为类的成员属性使用,可以修改
  9. person.age = 19
  10. println(person.age)
  11. //val修饰参数,作为类的只读属性使用,不能修改
  12. person.sex = "女"
  13. println(person.sex)
  14. }
  15. }