scala 中的类和对象
在Scala中,类(Class)是构建对象的模板,用于定义属性和方法,描述一类事物的共性。例如定义Car类,包含品牌、型号属性和行驶方法。 对象是类的实例,通过new关键字创建,可调用类的方法、访问属性。如val myCar = new Car("Tesla", "Model 3"),myCar.drive()即可执行行驶逻辑。 单例对象(以object定义)是特殊的对象,程序中仅一个实例,常用于工具方法定义、程序入口(如object AppEntry extends App)。比如object StringUtils中定义def reverse(s: String): String = s.reverse,调用时直接用StringUtils.reverse("Scala")。 类支持继承、多态等面向对象特性,单例对象则弥补了类需要实例化的限制,二者结合使Scala在面向对象编程中兼具灵活性与实用性,是其核心语法结构之一。
1.面向对象的相关概念
a. 什么是面向对象?
它是一种编程思想,它是基于面向对象的,强调的是以对象为基础完成各种操作。
b. 面向对象的三大思想特点是什么?
(1) 更符合人们的思考习惯
(2) 把复杂的事情简单化
(3) 把程序员从执行者变成指挥者
c. 面向对象的三大特征是
(1) 封装
(2) 继承
(3) 多态
[举例]: 封装,隐藏实现细节;继承,不劳而获的幸福;多态:丰富多彩的世界。
d. 什么是类class? 类是属性和行为的集合。
(1) 属性也叫成员变量:名词,用来描述事物的外在特征
(2) 行为也叫成员方法:动词,表示事物能做什么
[举例]:学生有姓名和年龄这些是属性,学生要学习,要吃饭这些是行为。
2.创建类和对象
在Scala中,用class来创建类,用new来创建对象。
[展示需求]
创建一个Person类,并创建它的对象,然后将对象打印到控制台上。
1. 使用IDEA创建一个scala项目,并创建object类。
2. 设置项目名,包名,项目地址。注意不要使用中文,空格,特殊符号作为名字及路径名。
/*
* 类使属性的集合
* 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 base57 {
def main(args: Array[String]): Unit = {
//创建一个学生对象
//vsl stu1 = new Student("小花",18)
//调用对象的方法
//stu1.sayHi()
//stu1,age = 19
//调用对象的方法
//stu1.sayHi
//这里没有设置参数,他会调用辅助构造函数
//val stu2 = new Student()
//stu2.sayHi()
val stu3 = new Student("小明")
stu3.sayHi()
}
}
结果如下图所示:
3.定义和访问成员变量
1. 创建一个Object类,添加main方法
2. 创建Person类,添加姓名字段和年龄字段,并对字段进行初始化,让scala自动推断
3. 在main方法中创建Person类对象,设置成员变量为张三,20
4. 打印对象的名字和年龄
//object 对象
//单例对象,直接使用object来定义。不能用new
//单例对象,只用一个,不能通过new开生成多个,它一般用来存放工具方法,常量...
object Tools {
val PI = 3.14
def doubleN(n:Int):Int = {
n * 2
}
}
object base60 {
def main(args: Array[String]): Unit = {
val rst = Tools.PI * Tools.doubleN(2)
println(s"rst = ${rst}")
}
}
4.定义和访问成员方法
类可以有自己的行为,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("你好 ")
}
}
5.理解构造器
构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。
new Class() 就是在调用构造器,或者叫调用构造函数。
代码如下:
object Main {
// 定义类
class Customer() {
println("构造函数被调用")
}
def main(args: Array[String]): Unit = {
val c = new Customer()
}
}
对应着生活中的例子:类就是模具,对象就是这个模具生产的产品。
6.构造函数的参数
[提问]:有没有方法可以直接在定义对象的时候就去给成员赋值?
在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("你好 ")
}
}