Scala - 访问修饰符

本章将带您了解 Scala 访问修饰符。 包、类或对象的成员可以使用访问修饰符 private 和 protected 进行标记,如果我们不使用这两个关键字中的任何一个,则访问将被假定为 public。 这些修饰符限制对某些代码区域的成员的访问。 要使用访问修饰符,您可以在包、类或对象的成员定义中包含其关键字,我们将在下一节中看到。


私有成员

私有成员仅在包含该成员定义的类或对象中可见。

以下是解释私有成员的示例代码片段 −

示例

class Outer {
   class Inner {
      private def f() { println("f") }
      
      class InnerMost {
         f() // OK
      }
   }
   (new Inner).f() // Error: f is not accessible
}

在 Scala 中,访问(新内部)。 f() 是非法的,因为 f 在 Inner 中被声明为私有,并且访问不是来自类 Inner。 相比之下,在 Innermost 类中对 f 的第一次访问是可以的,因为该访问包含在 Inner 类的主体中。 Java 将允许这两种访问,因为它允许外部类访问其内部类的私有成员。


受保护的成员

受保护的成员只能从定义该成员的类的子类中访问。

以下是解释受保护成员的示例代码片段 −

示例

package p {
   class Super {
      protected def f() { println("f") }
   }
   
   class Sub extends Super {
      f()
   }
   
   class Other {
      (new Super).f() // Error: f is not accessible
   }
}

在 Sub 类中访问 f 是可以的,因为 f 在"Super"类中声明为 protected,而"Sub"类是 Super 的子类。 相反,不允许在"Other"类中访问 f,因为"Other"类不继承自"Super"类。 在 Java 中,仍然允许后一种访问,因为"Other"类与"Sub"类在同一个包中。


公共会员

与私有成员和受保护成员不同,公共成员不需要指定 Public 关键字。 公共成员没有明确的修饰符。 可以从任何地方访问此类成员。

以下是解释公共成员的示例代码片段 −

示例

class Outer {
   class Inner {
      def f() { println("f") }
      
      class InnerMost {
         f() // OK
      }
   }
   (new Inner).f() // OK because now f() is public
}

保护范围

Scala 中的访问修饰符可以通过限定符进行扩充。 private[X] 或 protected[X] 形式的修饰符意味着访问是私有的或受保护的"直到"X,其中 X 指定一些封闭的包、类或单例对象。

考虑以下示例 −

示例

package society {
   package professional {
      class Executive {
         private[professional] var workDetails = null
         private[society] var friends = null
         private[this] var secrets = null

         def help(another : Executive) {
            println(another.workDetails)
            println(another.secrets) //ERROR
         }
      }
   }
}

注意 − 上述示例的以下几点 −

  • 封闭包专业中的任何类都可以访问变量 workDetails。

  • 封闭包社会中的任何类都可以访问变量好友。

  • 变量秘密只能在实例方法 (this) 中的隐式对象上访问。