scala中的类和对象

54 阅读5分钟

1. Scala 中的类

  • 概念:类是对象的模板,定义了对象的属性(成员变量)和行为(成员方法)。通过 class 关键字定义,可通过 new 关键字创建实例对象。

  • 特点

    • 类名通常首字母大写。
    • 类可以包含成员变量、成员方法、构造函数等。
    • 示例中 class Student(...) { ... } 定义了一个 Student 类,描述了 “学生” 的属性(姓名、年龄)和行为(打招呼)。

(二)创建类和对象

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

[展示需求]

创建一个Person类,并创建它的对象,然后将对象打印到控制台上。

[讲解步骤]

1. 使用IDEA创建一个scala项目,并创建object类。

2. 设置项目名,包名,项目地址。注意不要使用中文,空格,特殊符号作为名字及路径名。

object Main {

// 定义类  
class Person{ }  


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

    println("Hello world!")

    // 创建对象

    val p = new Person()

    println(p)

  }

}

}

2. Scala中的对象

1. 什么是面向对象?

它是一种编程思想,它是基于面向对象的,强调的是以对象为基础完成各种操作。

1. 面向对象的三大思想特点是什么?

(1) 更符合人们的思考习惯

(2) 把复杂的事情简单化

(3) 把程序员从执行者变成指挥者

2. 面向对象的三大特征是

(1) 封装

(2) 继承

(3) 多态

3. 什么是类class? 类是属性和行为的集合。

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

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

[举例]:学生有姓名和年龄这些是属性,学生要学习,要吃饭这些是行为。

  • 概念:有两种含义:

    1. 实例对象:通过类实例化的具体对象(如 new Student(...) 创建的 stu 和 stu1),每个对象拥有独立的属性值。
    2. 单例对象(Object) :通过 object 关键字定义,整个程序中只有一个实例(单例模式),常用于工具类、入口方法(main)定义等。
  • 示例

    • 代码中的 object class01 { ... } 是单例对象,包含了程序入口 main 方法。
    • val stu = new Student(...) 创建了 Student 类的实例对象 stu

3. 成员变量和成员方法

  • 成员变量:类中定义的变量,用于存储对象的状态,可通过类的构造参数直接定义(如 name 和 age)。

    • 示例中 class Student(var name:String, var age:Int) 中的 name 和 age 是成员变量,var 修饰表示可读写。
  • 成员方法:类中定义的函数,用于描述对象的行为,通过 def 关键字定义。

    • 示例中 def sayHello(): Unit = { ... } 是成员方法,功能是打印学生信息。

示例

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

[讲解格式]

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

def 方法名(参数1:数据类型 , 参数2:数据类型): [return type] = {

// 方法体

}

注意:返回值的类型可以不写,由Scala自动进行类型推断。

案例:一个名为customer的类,有两个属性,一个方法。

object Main {

 // 定义类

class Customer {

    var name: String = _

    var sex:String = "男"

    def sayHello(msg:String ) = {

      println("msg:", msg)

    }

  }

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

    val c = new Customer()

    c.sayHello("你好 ")

  }

}

定义和访问成员变量

[编码讲解]定义和访问成员变量。

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

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

[说明需求] 

1.  定义一个Person类,包含姓名和年龄字段

2.  创建一个名为张三,年龄为20的对象

3.  打印对象的名字和年龄

步骤

1. 创建一个Object类,添加main方法

2. 创建Person类,添加姓名字段和年龄字段,并对字段进行初始化,让scala自动推断

3. 在main方法中创建Person类对象,设置成员变量为张三,20

4. 打印对象的名字和年龄

示例:

object Main {

  // 定义类

  class Person{

    var age: Int = 20

    val name: String = "小明"

  }

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

    println("Hello world!")

    // 创建对象

    val p = new Person()

    println(p.name)

    p.age = 21

    println(p.age)

  }

}

使用下划线初始化成员变量。var可以让系统去设置默认值;例如var name:String = _

4. 构造函数和辅助构造函数

  • 主构造函数

    • 与类定义一体,类名后的参数列表即为构造函数参数(如 class Student(var name:String, var age:Int))。
    • 创建对象时(new Student(...))自动调用,类体中除方法定义外的代码(如 println("Student构造函数被调用....."))会在主构造函数执行时运行。
  • 辅助构造函数

    • 通过 def this(...) 定义,必须调用主构造函数或其他辅助构造函数(通过 this(...)),且参数列表与主构造函数不同。
    • 用于提供更多创建对象的方式。示例中 def this(name:String) { this(name, 15) } 是辅助构造函数,允许只传入姓名创建学生对象(年龄默认 15)。

示例运行逻辑

  1. 执行 new Student("小花", 18) 时,调用主构造函数:

    • 初始化 name = "小花"age = 18
    • 执行类体代码,打印 “Student 构造函数被调用.....”;
    • 调用 stu.sayHello() 输出 “我是小花,今年 18”。
  2. 执行 new Student("小明") 时,调用辅助构造函数:

    • 辅助构造函数通过 this(name, 15) 调用主构造函数,初始化 name = "小明"age = 15
    • 执行类体代码,打印 “Student 构造函数被调用.....”;
    • 调用 stu1.sayHello() 输出 “我是小明,今年 15”。

理解构造器

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

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

object Main {

    // 定义类

class Customer() {

    println("构造函数被调用")

  }

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

    val c = new Customer()

  }

}

构造函数的参数

[提问]:有没有方法可以直接在定义对象的时候就去给成员赋值?

在scala中,直接在定义类时,补充参数即可。

格式: class 类名([参数列表])

[编写示例代码]

object Main {

 // 定义类

class Customer(var name:String="小花", var:sex:String="男") {

    def sayHello(msg:String ) = {

      println("msg:", msg)

    }

  }

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

    val c = new Customer(“小花”,”女”)

    c.sayHello("你好 ")

  }  
}