🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔐 详细说明与示例

1. 默认(Public)访问

2. private修饰符

3. protected修饰符

4. private[this]修饰符

5. 包级访问权限 (private[包名])

💡 特别说明:伴生对象的特权

💎 总结


img

Scala 的访问修饰符用于精确控制类、对象、特质(trait)及其成员(字段、方法等)的可见性和访问权限,是实现封装的关键。

为了让你能快速了解 Scala 中各种访问修饰符的控制范围,我用一个表格来汇总其核心特性:

访问修饰符

主要访问范围

关键特性与注意事项

​默认(Public)​

任何地方

无需任何关键字,Scala 成员的默认访问级别。

private

定义该成员的类或对象内部

比 Java 更严格,外层类不能访问嵌套类的私有成员。

protected

定义该成员的类及其子类内部

与 Java 不同,​​不允许同一包内无继承关系的类访问​​。

private[this]

​仅限当前实例​

即使是同一类型的其他实例也无法访问。用于极严格的实例级封装。

private[包名]

指定的包及其子包内

实现包级私有访问。

protected[包名]

指定的包及其子包内,并且仅限于定义该成员的类及其子类

结合了包访问和继承访问。


🔐 详细说明与示例

1. 默认(Public)访问

如果没有指定任何访问修饰符,成员默认就是 public的,可以在任何地方被访问。

class MyClass {
  def publicMethod(): Unit = println("Anyone can access this.")
}

val obj = new MyClass
obj.publicMethod() // 合法访问
2. private修饰符

private成员只能在定义它的类或对象内部访问。

class MyClass {
  private val secret = 42
  def showSecret(): Unit = println(secret) // 合法,在类内部访问
}
val obj = new MyClass
// println(obj.secret) // 编译错误:无法访问 private 成员
obj.showSecret() // 通过公共方法间接访问,输出 42

Scala 的 private比 Java 更严格,​​外层类甚至不能访问其嵌套类的私有成员​​。

3. protected修饰符

protected成员可以在定义它的类及其子类中访问。

​注意​​:与 Java 不同,Scala 的 protected成员​​不能被同一个包下的其他无关类访问​​。

class Parent {
  protected val familyValue = 100
}
class Child extends Parent {
  def useProtected(): Unit = println(familyValue) // 合法,子类内部访问
}
val child = new Child
// println(child.familyValue) // 编译错误:无法访问 protected 成员
4. private[this]修饰符

private[this]修饰的成员访问权限仅限于​​当前对象实例​​。 即使是同一类的其他实例也无法访问。

class MyClass {
  private[this] var instanceSecret = 10
  def compare(other: MyClass): Unit = {
    // println(other.instanceSecret) // 编译错误:无法访问其他实例的 private[this] 成员
    println(this.instanceSecret) // 只能访问当前实例的成员
  }
}

这确保了对象状态的强封装性,常用于防止在类内部意外修改其他实例的状态。

5. 包级访问权限 (private[包名])

Scala 允许通过 private[包名]protected[包名]来定义包级别的访问权限。 成员在指定的包及其子包内可见。

package com.example {
  class MyClass {
    private[example] val packagePrivateValue = 42 // 在 com.example 包内可见
  }
}

package com.example.utils {
  class UtilClass {
    val obj = new com.example.MyClass
    println(obj.packagePrivateValue) // 合法,因为在同一个 example 包范围内
  }
}

// 另一个包下的类则无法访问
package com.other {
  class OtherClass {
    val obj = new com.example.MyClass
    // println(obj.packagePrivateValue) // 编译错误
  }
}

这种方式在模块化开发中非常有用,可以定义一些在项目内部子包可见但对项目外部完全隐藏的成员。


💡 特别说明:伴生对象的特权

在 Scala 中,​​伴生对象​​(与类同名的对象)和​​伴生类​​可以互相访问对方的私有成员(包括 privateprotected),这是一种特殊情况。

class MyClass {
  private val privateMemberOfClass: String = "Class's Secret"
}

object MyClass { // MyClass 的伴生对象
  def peekIntoClass(instance: MyClass): String = {
    instance.privateMemberOfClass // 合法:伴生对象可以访问伴生类的私有成员
  }
}

💎 总结

Scala 的访问控制机制非常灵活和精确。 选择合适的修饰符,可以帮助你写出更安全、更易于维护的代码:

  • 默认就是 public,无需声明。

  • 需要隐藏细节时,优先考虑 private

  • 允许子类扩展时使用 protected,并记住 Scala 的规则比 Java 更严格。

  • 需要实施极致的实例级封装时,使用 private[this]

  • 进行模块化开发或管理大型项目时,利用 private[包名]来控制包内可见性。

  • 记住伴生对象和伴生类之间的特殊访问规则。

希望这些信息能帮助你更好地理解和使用 Scala 的访问修饰符。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐