本章将介绍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. 《转载》WIN10 64位系统 32位Python2.7 PIL安装

    http://blog.csdn.net/kanamisama0/article/details/53960281 首先安装这个真的出了好多问题,之前装过一次PIL也失败了,就一直没管,今天刚好找了机 ...

  2. Puppet nginx+passenger模式配置

    Puppet nginx+passenger模式配置 一.简述:Puppet 运行在单台服务器上默认启动的是一个puppetmaster进程,当遇到client高并发的请求时,基于ruby的WEBRi ...

  3. 反编译获取线上任何微信小程序源码(转)

    看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前端大神们是如何规避了小程序的各种奇葩的坑?那么赶紧来 ...

  4. Android 本地搭建Tomcat服务器供真机测试

    准备工具:tomcat    环境:win7 + JDK1.8 + tomcat 9.0.13(64bit) 准备工具:tomcat    1.tomcat官网下载   https://tomcat. ...

  5. H.264 White Paper学习笔记(一)总览

    H.264 White Paper对于264编码器的原理讲的比较透彻,在阅读学习的时候收获很大,这份文献网上有很多了,也有不少人翻译,不过想要理解更清楚我觉得还是得看英文原版的. 首先看一下白皮书里给 ...

  6. Sencha Touch 实战开发培训 视频教程 第二期 第一节

    经过忙碌的准备,终于在2014.4.7晚上8:10分开课. 本来预定在8点开课的,不过电脑出了点问题,推迟了. 本期培训一共八节,前两节免费,后面的课程需要付费才可以观看. 本节内容: 了解Sench ...

  7. 使用mimikatz获取和创建Windows凭据的工具和方法

    Mimikatz 下载地址 https://github.com/gentilkiwi/mimikatz/releases 本地凭据破解 以管理员身份运行(拿到shell提权后) mimikatz#p ...

  8. 关于数据库DB负载均衡的初步研究(二)

    负载均衡: 是什么:有一组服务器由路由器联系在一起,各个节点相互协作,共同负载,均衡压力. 实现原理:应用程序与DB之间有个中央控制台服务器,根据负载均衡策略决定访问哪一台DB服务器. DB服务器:读 ...

  9. stdarg.h头文件源代码分析

    谈到C语言中可变参数函数的实现(参见C语言中可变参数函数实现原理),有一个头文件不得不谈,那就是stdarg.h 本文从minix源码中的stdarg.h头文件入手进行分析: #ifndef _STD ...

  10. 使用python语言操作MongoDB

    MongoDB是一个跨平台的NoSQL,基于Key-Value形式保存数据.其储存格式非常类似于Python的字典,因此用Python操作MongoDB会非常的容易. pymongo的两种安装命令 p ...