Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。

如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public。

Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。

私有(Private)成员


用private关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。

class Outer{
class Inner{
private def f(){println("f")}
class InnerMost{
f() // 正确
}
}
(new Inner).f() //错误
}

(new Inner).f( ) 访问不合法是因为 f 在 Inner 中被声明为 private,而访问不在类Inner之内。

但在 InnerMost 里访问f就没有问题的,因为这个访问包含在 Inner 类之内。

Java中允许这两种访问,因为它允许外部类访问内部类的私有成员。

保护(Protected)成员


在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。

package p{
class Super{
protected def f() {println("f")}
}
class Sub extends Super{
f()
}
class Other{
(new Super).f() //错误
}
}

上例中,Sub 类对 f 的访问没有问题,因为 f 在 Super 中被声明为 protected,而 Sub 是 Super 的子类。相反,Other 对 f 的访问不被允许,因为 other 没有继承自 Super。而后者在 java 里同样被认可,因为 Other 与 Sub 在同一包里。

公共(Public)成员


Scala中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。

class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // 正确
}
}
(new Inner).f() // 正确因为 f() 是 public
}

作用域保护


Scala中,访问修饰符可以通过使用限定词强调。格式为:

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。

参考:http://www.runoob.com/scala/scala-access-modifiers.html

最新文章

  1. Scala 包
  2. MMDrawerController 的使用
  3. Why GUID primary keys are a database’s worst nightmare
  4. WP8 学习 ApplicationBar 的创建 XAML代码
  5. MySQL 库大小、表大小、索引大小查询命令
  6. Mac下Apache服务器配置
  7. 算法之旅,直奔<algorithm>之十 count_if
  8. .net 和 core2.0 数据库连接字符串
  9. Reading Text from Images Using C#
  10. 记一次Win Server 2012部署问题及解决方法
  11. MySql 学习参考目录
  12. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-3-Command-line completion命令补全
  13. MySQL的order by时区分大小写
  14. UE 技巧
  15. 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #5 使用checkpatch.pl检查补丁的格式
  16. .Net平台技术介绍、C#语言
  17. 使用mock.js进行数据模拟
  18. 我的sourceinsight的配置
  19. C++ 重载操作符- 02 重载输入输出操作符
  20. python的if语句、while循环、for循环

热门文章

  1. Python脚本 - 常用单位转换
  2. edittext 的一个案例
  3. Geoserver发布缓存切片(制定Gridsets)
  4. 设置Eclipse/MyEclipse中编辑界面点击任何文件后Package Explorer导航自动定位该文件
  5. CMDB (后台管理) CURD 插件
  6. 《java并发编程实战》读书笔记6--取消与关闭
  7. Zookeeper之Curator(1)客户端对节点的一些监控事件的api使用
  8. hdu 1426(DFS+坑爹的输入输出)
  9. 【hdoj_2082】找单词
  10. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API