第六章 scala面向对象基础
6.1 通过一个例子入门
张老太养了两只猫:一直名字叫小白,今年3岁,白色。还有一只叫小花,今年10岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名字错误时,就显示张老太没有这只猫。
问题:
- 猫有三个属性,类型不一样。
- 如果使用普通变量就不好管理。
- 使用一种新的「数据类型」可以管理多个不同类型的数据【属性】,可以对属性进行操作-「方法」
scala语言是面向对象的
- Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型,null,静态方法等等
- Scala语言是来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言,即在Scala中,一切都是对象。
- 在面向对象的学习过程中可以对比着Java语言学习。
对上面的例子写成Cat类
object TestScala {
def main(args: Array[String]): Unit = {
//创建一只猫
val cat = new Cat
//给猫的属性赋值
cat.name = "小白"
cat.age = 10
cat.color = "白色"
}
}
//定义一个类
class Cat{
//声明三个属性,并且需要赋初始值
//说明:
//1.当我们声明了var name :String时,在底层对应 private name
//2. 同时会生成两个public方法 name(),类似于 public String getName() 方法
var name:String = ""
var age:Int = 0
var color:String = ""
}
object TestScala {
def main(args: Array[String]): Unit = {
//创建一只猫
val cat = new Cat
//给猫的属性赋值
cat.name = "小白"
cat.age = 10
cat.color = "白色"
}
}
//定义一个类
class Cat{
//声明三个属性,并且需要赋初始值
//说明:
//1.当我们声明了var name :String时,在底层对应 private name
//2. 同时会生成两个public方法 name(),类似于 public String getName() 方法
var name:String = ""
var age:Int = 0
var color:String = ""
}
说明:
- 当我们声明了var name :String时,在底层对应 private name
- 同时会生成两个public方法 name(),类似于 public String getName() 方法
6.2 类的定义
[修饰符] class 类名{
类体
}
[修饰符] class 类名{
类体
}
6.2.1 定义类的注意事项
- scala语法中,类并不声明为public,所有这些类都具有共有可见性(即默认就是public)
- 一个scala源文件可以包含多个类。
- 定义的属性可以是值数据类型,也可以是引用类型。
6.2.2 属性/成员变量注意事项
- 属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [:类型] = 属性值
- 属性的定义类型可以为任意类型,包含值类型或引用类型
- Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)
- 如果赋值为null,则一定要加类型,因为不加类型,那么概述性的类型就是Null类型。
6.3 创建对象
基本语法
val | var 对象名 : 类型 = new 类型()
val | var 对象名 : 类型 = new 类型()
说明:
- 如果我们不希望改变对象的引用(即:内存地址),应该声明val性质的,否则声明为var,scala设计者推荐使用val,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用。
- scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,「但当类型和后面new对象类型有继承关系即多态时,就必须写了」。
6.4 类和对象的内存分配机制
同java的类和对象内存分配机制相同,如图所示: