博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scala(5)-----访问修饰符
阅读量:5824 次
发布时间:2019-06-18

本文共 2087 字,大约阅读时间需要 6 分钟。

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。这样的成员在任何地方都可以被访问。

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

转载于:https://www.cnblogs.com/DeepRunning/p/9205968.html

你可能感兴趣的文章
Grunt使用心得
查看>>
【阿里云文档】常用文档整理
查看>>
iptables 配置需要保存
查看>>
.NET各种小问题
查看>>
ApkTool反编译和重新打包
查看>>
OpenState: Programming Platform-independent Stateful OpenFlow Applications Inside the Switch
查看>>
java中的Volatile关键字
查看>>
前端自定义图标
查看>>
sqlserver 取取月初月末和月份间隔
查看>>
Vagrant的一个BUG - 不支持'change_host_name'
查看>>
实验二
查看>>
MongoDB数据库迁移
查看>>
独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!
查看>>
java的继承性
查看>>
Linux下部署SSH登录时的二次身份验证环境记录(利用Google Authenticator)
查看>>
python实战之编码问题:中文!永远的痛
查看>>
使用hexo搭建github个人博客网站
查看>>
UVA 436 - Arbitrage (II)(floyd)
查看>>
操作系统学习(五)-- 操作系统之内存管理
查看>>
SQL Server 字符串函数
查看>>