从数据的角度:封装 (encapsulation) 就是把抽象出的数据和对数据的操做封装在一块儿,数据被保护在内部,程序的其它部分只有经过被受权的操做(成员方法),才能对数据进行操做安全
从模块的角度:封装就是将须要重复使用的逻辑封装成共有的模块,提升开发效率,减小重复性编码ide
隐藏实现细节this
既能够对数据进行验证,又保证数据的安全合理编码
将属性进行私有化spa
提供一个公共的 set
方法,用于对属性判断并赋值scala
Java 和 Scala 提供的访问权限修饰符code
def setXxx(参数名 : 类型) : Unit = {
//加入数据验证的业务逻辑
属性 = 参数名
}
复制代码
get
方法,用于获取属性的值def getXxx() [: 返回类型] = {
return 属性
}
复制代码
建立一个员工类,对其必要属性进行私有化,并限制年龄只能为 [0,120]
对象
object StuffDemo {
def main(args: Array[String]): Unit = {
val stuff = new Stuff(sex = 'M')
println(stuff) // Stuff(2000.0, 18, M)
stuff.setAge(24)
println(stuff) // Stuff(2000.0, 24, M)
stuff.setAge(190)
println(stuff) // Stuff(2000.0, 24, M)
}
}
/** * 能够在主构造器中定义属性的默认值,甚至是设置属性的访问权限,可是失去了对属性的控制(解决方式是能够在调用构造方法前对设置的属性进行验证) * * @param salary * @param age * @param sex */
class Stuff(private var salary: Double = 2000, val sex: Char) {
private var age: Int = 18
def setAge(age: Int): Unit = {
if (age >= 0 && age <= 120) {
this.age = age
}
}
override def toString = s"Stuff($salary, $age, $sex)"
}
复制代码
Scala
中为了简化代码的开发,在类中声明属性时,自动提供对应的 setter/getter
方法(方法名为 属性名_&eq/属性名
);若是属性访问权限声明为 private
,对应 setter/getter
方法的访问权限是 private
;若是属性声明省略访问权限(编译器会自动为其加上 public
访问权限),对应 setter/getter
方法的访问权限是 private
set 和 get
,只须要声明该属性便可;访问属性直接使用 对象.属性
便可(实质上是调用编译器自动生成的 getter
方法);设置属性直接使用 对象.属性=xxx
便可(实质上是调用编译器自动生成的 setter
方法)