Scala 访问修饰符

简介: Scala 访问修饰符

在 Scala 中,访问修饰符用于控制类、对象、特质(traits)及其成员(如字段和方法)的可见性和访问权限。

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

}


包级私有访问(Package-Private)

Scala还支持包级私有访问修饰符,用于限制成员只能在特定包内访问。可以通过将private关键字后跟一个包名来实现。格式为:

private[x] 


 


protected[x]

这里的 x 指代某个所属的包、类或单例对象。

如果写成 private[x],读作 "这个成员除了对 […] 中的类或 […] 中的包中的类及它们的伴生对像可见外,对其它所有类都是 private"

这种技巧在横跨了若干包的大型项目中非常有用,它允许你定义一些在你项目的若干子包中可见但对于项目外部的客户却始终不可见的东西。

实例

package bobsrockets{

   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。


伴生对象和伴生类

在 Scala 中,伴生对象和伴生类可以互相访问对方的私有成员。伴生对象和伴生类是同名且在同一文件中的类和对象。

实例

class CompanionExample {

 private val privateField: String = "I am private in class"

}


object CompanionExample {

 def accessPrivateField(example: CompanionExample): String = {

   example.privateField  // 伴生对象可以访问类的 private 成员

 }

}


object Main {

 def main(args: Array[String]): Unit = {

   val example = new CompanionExample

   println(CompanionExample.accessPrivateField(example))

 }

}

目录
相关文章
|
8月前
|
数据采集 存储 Web App开发
网页爬虫开发:使用Scala和PhantomJS访问知乎
网页爬虫开发:使用Scala和PhantomJS访问知乎
|
分布式计算 Java Hadoop
Spark集群搭建记录 | 云计算[CentOS8] | Scala Maven项目访问Spark(local模式)实现单词计数(下)
step6 创建scala object step7 修改pom文件 step8 配置项目 step9 添加依赖库(Spark的jar包) step10 设置输入路径
170 0
Spark集群搭建记录 | 云计算[CentOS8] | Scala Maven项目访问Spark(local模式)实现单词计数(下)
|
分布式计算 IDE Java
Spark集群搭建记录 | 云计算[CentOS7] | Scala Maven项目访问Spark(local模式)实现单词计数(上)
写在前面 step1 下载Scala IDE step2 解压安装Scala IDE step3 Scala 下载 step4 Scala 配置 step5 创建scala项目
168 0
Spark集群搭建记录 | 云计算[CentOS7] | Scala Maven项目访问Spark(local模式)实现单词计数(上)
|
Java Scala Shell
scala简要:文件访问
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
835 0
|
3月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
77 5
|
3月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
57 3
|
3月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
51 0
|
3月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
105 0