HoRain云--Scala访问修饰符全解析:从入门到精通

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

Scala 的访问修饰符用于精确控制类、对象、特质(trait)及其成员(字段、方法等)的可见性和访问权限,是实现封装的关键。
为了让你能快速了解 Scala 中各种访问修饰符的控制范围,我用一个表格来汇总其核心特性:
|
访问修饰符 |
主要访问范围 |
关键特性与注意事项 |
|---|---|---|
|
默认(Public) |
任何地方 |
无需任何关键字,Scala 成员的默认访问级别。 |
|
|
定义该成员的类或对象内部 |
比 Java 更严格,外层类不能访问嵌套类的私有成员。 |
|
|
定义该成员的类及其子类内部 |
与 Java 不同,不允许同一包内无继承关系的类访问。 |
|
|
仅限当前实例 |
即使是同一类型的其他实例也无法访问。用于极严格的实例级封装。 |
|
|
指定的包及其子包内 |
实现包级私有访问。 |
|
|
指定的包及其子包内,并且仅限于定义该成员的类及其子类 |
结合了包访问和继承访问。 |
🔐 详细说明与示例
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 中,伴生对象(与类同名的对象)和伴生类可以互相访问对方的私有成员(包括 private和 protected),这是一种特殊情况。
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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐


所有评论(0)