本章将介绍Scala访问修饰符。包,类或对象的成员可以使用私有(private)和受保护(protected)的访问修饰符进行标注,如果不使用这两个关键字的其中一个,那么访问将被视为公开(public)的。这些修饰符限制了对某些代码区域的成员访问。要使用访问修饰符,请将其关键字包含在包,类或对象的成员的定义中,我们将在下一节中看到。

私有成员

私有(private)成员只能在包含成员定义的类或对象内部可见。

以下是示例代码段解释私有(private)成员 -

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

在Scala,访问(new Inner). f()是非法的,因为fInner类中声明为private,并且访问不在Inner类内。 相比之下,第一次在“InnerMost”类中访问f()是可以的,因为该访问包含在Inner类的主体中。在Java中也允许这样的两个访问,因为它允许外部类访问其内部类的私有成员。

受保护的会员

受保护(protected)成员只能从定义成员的类的子类访问。以下是说明受保护(protected)成员的示例代码片段 -

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中,后者的访问将仍然允许,因为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在封闭包professional中的任何类中可访问。
  • 封闭包:friends的任何类都可以被society包中任何类访问。
  • 变量:secrets只能在实例方法的隐式对象(this)中访问。

Scala系统学习(五):Scala访问修辞符的更多相关文章

  1. C#中五种访问修饰符作用范围 public、private、protected、internal、protected internal

    1.五种访问修饰符包括哪些? public.private.protected.internal.protected internal 2.五种访问修饰符的作用范围? public  :公有访问.不受 ...

  2. C#的五种访问修饰符

    简述: 所有类型和类型成员都具有可访问性级别,用来控制是否可以在您程序集的其他代码中或其他程序集中使用它们. 可使用访问修饰符指定声明类型或成员的可访问性. 在C#语言中,共有五种访问修饰符:publ ...

  3. Scala学习文档-访问修饰符

    在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...

  4. scala学习手记10 - 访问修饰符

    scala的访问修饰符有如下几个特性: 如果不指定访问修饰符,scala默认为public: 较之Java,scala对protected的定义更加严格: scala可以对可见性进行细粒度的控制. s ...

  5. Scala系统学习(四):Scala变量

    变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...

  6. Scala系统学习(三):Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  7. Scala系统学习(二):Scala开发环境安装配置

    Scala可以安装在任何基于UNIX/Linux或基于Windows的系统上.在您的机器上开始安装Scala之前,必须在计算机上安装Java 1.8或更高版本. 下面请按照以下步骤安装Scala. 步 ...

  8. Scala系统学习(一):Scala概述

    Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...

  9. Scala - 快速学习01 - Scala简介

    Scala简介 Scala(Scalable Language)是一门多范式(multi-paradigm)编程语言,Scala的设计吸收借鉴了许多种编程语言的思想,具备面向对象编程.函数式编程等特性 ...

随机推荐

  1. struts.xml文件中配置tiles.xml

    Apache Tiles是一个JavaEE应用的页面布局框架.Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布局.布局由可以复用的多个块组成,每个页面可以 ...

  2. kubernetes 测试 Mariadb gtid 主从复制.

    k8s 为 1个master 3个node 下载镜像 : mariadb 镜像版本是10.2.13 (此时10.3还没发布正式版) docker pull mariadb push到私有仓库 dock ...

  3. Makefile 中all 和.PHONY的作用

    请编写一个makefile同时编译.链接下面两个程序: main1.c: #include<stdio.h> int main(void) { printf("main1\n&q ...

  4. Elasticsearch 学习之 分片未分配原因

    分片未分配的原因主要有: 1)INDEX_CREATED:由于创建索引的API导致未分配.2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配.3)INDEX_REOPENED :由于 ...

  5. $@和 $*-linux_Shell

    =================1.问题======= 在使用$@和 $*的时候有时候会混淆. ================2.实践出真知===== 分别用三种参数设置: "a b c ...

  6. JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  7. 2555: SubString[LCT+SAM]

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 2601  Solved: 780 [Submit][Status][ ...

  8. Rsync未授权访问漏洞的利用和防御

    首先Rsync未授权访问利用 该漏洞最大的隐患在于写权限的开启,一旦开启了写权限,用户就可以,用户就可以利用该权限写马或者写一句话,从而拿到shell. 我们具体来看配置文件的网相关选项(/etc/r ...

  9. 23种设计模式之策略模式(Strategy)

    策略模式是一种对象的行为型模式,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换.策略模式比算法独立于使用它的客户而变化,其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类. ...

  10. 理解 ARC 下的循环引用

    本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚 ...