- Scala Tutorial
- Scala - Home
- Scala - Overview
- Scala - Environment Setup
- Scala - Basic Syntax
- Scala - Data Types
- Scala - Variables
- Scala - Classes & Objects
- Scala - Access Modifiers
- Scala - Operators
- Scala - IF ELSE
- Scala - Loop Statements
- Scala - Functions
- Scala - Closures
- Scala - Strings
- Scala - Arrays
- Scala - Collections
- Scala - Traits
- Scala - Pattern Matching
- Scala - Regular Expressions
- Scala - Exception Handling
- Scala - Extractors
- Scala - Files I/O
- Scala Useful Resources
- Scala - Quick Guide
- Scala - Useful Resources
- Scala - Discussion
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中,访问(新的Inner)。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”类中被声明为受保护的,而“Sub”类是 Super 的子类。相比之下,不允许访问“Other”类中的 f,因为“Other”类不是从“Super”类继承的。在 Java 中,仍然允许后者访问,因为“其他”类与“子”类位于同一包中。
公众会员
与私有成员和受保护成员不同,公共成员不需要指定 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 可供封闭包 professional 中的任何类访问。
封闭包社会中的任何类都可以访问变量朋友。
变量秘密只能在实例方法(this)内的隐式对象上访问。