作者:jiangzz
电话:15652034180
微信:jiangzz_wx
微信公众账号:jiangzz_wy
百知教育
可见性
Scala 中的默认可见性为 public,所谓默认即你没有在类或者成员前显示加 private 或 protected 可见性关键字。虽然默认可见性为 public,但这是逻辑上的,实际上 Scala 中并没有 public 这个关键字,如果你用 public 来声明一个类或成员,编译器会报错。
class Student {
var id=1
var name="zhanngsan"
var age=18
var birthDay = new Date ()
}
在 Scala 中,可以在类型的 class 或 trait 关键字之前、字段的 val 或 var 之前,方法定义的 def 关键字之前指定可见性。
Private
修饰类
该类只能被同包下的子类继承,不同包类不可见,并且同包继承的类也必须是private修饰。因为这样才不会改变原始父类的可见性。
private class Student {
var id=1
var name="zhanngsan"
var age=18
var birthDay = new Date ()
def sayHello():Unit={
println(this.id)
}
}
private class SmallStudent extends Student {
}
要求SmallStudent必须和Student在同一个包下,且必须有Private修饰
修饰属性|方法
在修饰属性表示该属性/方法只能被本类|伴生对象可见,其他均不可见。
private class Student {
private var id=1
var name="zhanngsan"
var age=18
var birthDay = new Date ()
private def method():Unit={
}
}
object Student{
def main(args: Array[String]): Unit = {
var stu=new Student()
stu.id=1
stu.method()
}
}
Protected
对于受保护可见性,用 protected 声明,受保护成员|方法对本类、继承类可见。而受保护的类则只对包含该类的包内可见。
修饰类
protected class Student {
var id=1
protected var name="zhanngsan"
}
class SmallStudent extends Student {
}
只要求SmallStudent和Student处于同一个包中,其他无要求。
修饰属性|方法
在修饰属性表示该属性/方法只能被本类|伴生对象以及子类和子类的伴生对象可见,其他均不可见
class Student {
var id=1
protected var name="zhanngsan"
}
class SmallStudent extends Student {
}
object SmallStudent{
def main(args: Array[String]): Unit = {
var small=new SmallStudent
small.name
}
}
this限定
如果严格限定属性可以操作范围仅仅限制在本类,去除伴生对象的可见性,可以添加this限定。
class Student(name:String) {
var id=1
protected|private[this] var sex=true
def sayHello():Unit={
println(this.name)
}
}
object Student{
def apply(name: String): Student = new Student(name)
}
表示去除伴生对象可见性,严格限定该属性只能在本类中或者子类中使用。
package
表示属性sex针对于在demo01包以及子包可见。
class Student(name:String) {
var id=1
private [demo01] var sex=true
def sayHello():Unit={
println(this.name)
}
}
object Student{
def apply(name: String): Student = new Student(name)
}
final
final可以修饰Class和方法,final修饰的类不可以被继承,修饰的方法|属性不可以被覆盖。
class Student(name:String) {
final var id:Int=1
final def sayHello():Unit={
println(this.name)
}
}
这里注意这里被final修饰的属性并不代表只读,只是表示不能被子类属性遮盖。但是在Java中final修饰的属性不允许重复修改的。
sealed
Trait和class可以标记为 sealed
,这意味着必须在同一文件中声明所有子类型这样就确保了所有的子类型都是已知的。
sealed abstract class Student(name:String) {
var id:Int=1
def sayHello():Unit={
println(this.name)
}
}
class SmallStudent(name:String) extends Student(name:String) {
}