Scala学习第四弹 访问修饰符

来源:互联网 发布:如何正确下载软件 编辑:程序博客网 时间:2024/04/20 23:08

很高兴有人看到了我的blog,还有评论,我会继续努力
Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。
如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public。
Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。
Private私有成员
用private关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。
class Animal{
class Dog{
private def f(){println(“f”)}
class Dog1{
f() // 正确
}
}
(new Dog).f() //错误
}
(new Dog).f( ) 访问不合法是因为 f 在 Dog中被声明为 private,而访问不在类Dog之内。
但在 Dog1里访问f就没有问题的,因为这个访问包含在 Inner 类之内。
Java中允许这两种访问,因为它允许外部类访问内部类的私有成员。
Protectd保护成员
在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。
class Dog{
protected def f() {println(“f”)}
}
class dog1 extends Dog{
f()
}
class Cat{
(new Dog).f() //错误
}
上例中,dog1类对 f 的访问没有问题,因为 f 在 Dog中被声明为 protected,而 doga是 Dog的子类。相反,Cat 对 f 的访问不被允许,因为 Cat没有继承自 Dog。而后者在 java 里同样被认可,因为 Dog与 dog1在同一包里。
public公有成员
Scala中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。
作用域保护
private[x]

protected[x]
这里的x指代某个所属的包、类或单例对象。如果写成private[x],读作”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。
这种技巧在横跨了若干包的大型项目中非常有用,它允许你定义一些在你项目的若干子包中可见但对于项目外部的客户却始终不可见的东西。
package bobsrocckets{
package navigation{
private[bobsrockets] class Navigator{
protected[navigation] def useStarChart(){}
class LegOfJourney{
private[Navigator] val distance = 100
}
private[this] var speed = 200
}
}
package launch{
import navigation._
object Vehicle{
private[launch] val guide = new Navigator
}
}
}
上述例子中,类Navigator被标记为private[bobsrockets]就是说这个类对包含在bobsrockets包里的所有的类和对象可见。
比如说,从Vehicle对象里对Navigator的访问是被允许的,因为对象Vehicle包含在包launch中,而launch包在bobsrockets中,相反,所有在包bobsrockets之外的代码都不能访问类Navigator。

0 0
原创粉丝点击