scala学习手记10 - 访问修饰符
scala的访问修饰符有如下几个特性:
- 如果不指定访问修饰符,scala默认为public;
- 较之Java,scala对protected的定义更加严格;
- scala可以对可见性进行细粒度的控制。
scala的默认访问修饰符
如果没有修饰符,scala会默认把类、字段、方法的访问修饰符当做public。如果要将之调整为private或protected,只需在前面添加对应的修饰符关键字即可。就如下面的程序:
class Microwave{
def start() = println("started")
def stop() = println("stopped")
private def turnTable() = println("turning table")
}
val microwave = new Microwave
microwave.start()
microwave.turnTable()//这里错了
在上面的代码里start和stop两个方法被定义为public类型,可以通过任意Microwave实例访问;turnTable被显示定义为private,这样就不能在Microwave类外部访问它。执行这段代码,就会如注释处声明的一样,会在该处报错:

protected修饰符
在scala里,用protected修饰的成员只对本类和派生类可见,同一个包内的其他的类不可见。而且派生类只可以访问本类实例的protected成员。可以通过一个例子看一下:
package com.zhyea.scala.autos /**
* Created by robin on 2016/6/12.
*/
class Vehicle {
protected def checkEngine() = println("checked engine")
} class Car extends Vehicle { def start() {checkEngine()} def tow(car : Car) {
car.checkEngine()
} def tow(vehicle: Vehicle){
vehicle.checkEngine()//会报错
}
} class GasStation{
def fillGas(vehicle : Vehicle){
vehicle.checkEngine()//会报错
} }
编译这段代码会报错:

在这段代码里,Vehicle的checkEngine()方法是protected型的。scala允许我们通过Vehicle的派生类Car的实例方法(start())访问这个方法,也允许我们在Car的实例方法里通过Car的实例来访问这个方法,但是不允许在Car的实例方法里用Vehicle的实例访问checkEngine()方法,同一包内的其他类也不行。(好绕,不过真是保护到了极致:只输出方案不输出资源,狗腿子军师)
细粒度访问控制
一方面scala对待protected比Java更加严格,另一方面它提供了更多的灵活性和更细粒度的访问规则。
private和protected可以指定额外的参数。这样,现在可以使用private[AccessQualifier],AccessQualifier可以是this,也可以是其它的类名或包名。这样就可以这么理解:这个成员对所有类都是private,除了自己和AccessQualifier所表示范围内的类。这个概念也是可以递推的,也就是说,如果AccessQualifier是一个类,那么private成员对于AccessQualifier的AccessQualifier也是可见的。
看一个细粒度访问控制的例子:
/**
* Created by robin on 2016/6/13.
*/
package society { package professional { class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secret = null def help(another: Executive) {
println(another.workDetails)
println(this.secret)
println(another.secret) //会报错
}
} } package social { class Acquaintance {
def socialize(person: professional.Executive) {
println(person.friends)
println(person.workDetails) //会报错
}
} }
}
这段代码里面有一个嵌套包的使用:可以看到,在society包里又声明了professional和social两个包。而且使用包的方式也和之前不一样,之前使用的是点号分隔,文件头声明的方式。
在类Executive的定义中,三个私有成员变量有着不同的作用范围。workDetails对包professional内的类可见,friends对society包内的类可见,而secret只对当前实例可见。
所以编译这段代码,在标记报错的地方会报错:

secret只对当前实例this可见,对Executive的其他实例不可见。workDetails对包professional内的类可见,对society包内的类不可见。因此会报错。
##########
scala学习手记10 - 访问修饰符的更多相关文章
- Scala学习文档-访问修饰符
在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...
- Java入门系列之访问修饰符作用范围
前言 之前以为Java和C#中访问修饰符差不多一样,后面才了解到还是有些差异,本节只讲解学习Java中访问修饰符一些需要注意的地方或者从概念上不太好理解我们会通过实际例子来说明,若有错误之处,还请批评 ...
- Spark记录-Scala变量/访问修饰符/运算符
变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...
- Scala:访问修饰符、运算符和循环
http://blog.csdn.net/pipisorry/article/details/52902234 Scala 访问修饰符 Scala 访问修饰符基本和Java的一样,分别有:privat ...
- Scala访问修饰符(四)
Scala 访问修饰符基本和Java的一样,分别有:private,protected,public. 如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public. Scala ...
- C#学习-图解教程(2):访问修饰符(其中两种)
学习内容:C#:学习书籍:图解教程(中文第四版). 目录:第四章 类的基本概念 -----> 4.8 访问修饰符 访问修饰符 从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其他成员. ...
- Scala访问修饰符
Scala 访问修饰符基本和Java的一样,分别有:private,protected,public. 如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public. Scala ...
- C#学习笔记06--类/对象/访问修饰符/方法
编程思想 1.面向过程 面向过程是要把问题解决的过程分成有一定顺序的不同步骤, 然后按照步骤一步步的将问题解决. 2.面向对象 面向对象解决问题的思路是先分析问题中所涉及的对象, 然后 ...
- Java学习笔记:04面向对象-内部类_访问修饰符_final
04面向对象-内部类/访问修饰符/final 1.static的介绍 static:关键字,静态的 static的作用是用来修饰类中的成员 2.访问一个类中的某一个成员变量 方法一: _1.创建对象 ...
随机推荐
- 【IDEA】单元测试:项目中引入JUnit测试框架+Mock简单了解
一.Junit 使用和说明: 参考:单元测试第三弹--使用JUnit进行单元测试-HollisChuang's Blog http://www.hollischuang.com/archives/17 ...
- SQSERVER--函数、开窗函数,-特殊的内容 (for xml path )
1.STUFF SQL Server之深入理解STUFF sql stuff函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符.sql stuff函数中如果开始位置或长度值是负数,或者如果 ...
- delphi ----处理SQL server主键自增,并给定值
获取一个表中最大的值. function GetNEWID(tablename: string): string; begin Result:=''; with DMW_Public.DQ_Pub d ...
- 【Python之路】第十九篇--Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
- 找不到Microsoft Access Driver(*.mdb)ODBC驱动程序的安装例程。请重新安装驱动
按照教材创建的方法:“控制面板-管理工具-数据源(ODBC)”,打开“ODBC数据源管理器”窗口,然后“添加”,打开“创建新数据源”的窗口,最后选择Microsoft Access Driver(*. ...
- ASP.NET Identity 2集成到MVC5项目--笔记02
ASP.NET Identity 2集成到MVC5项目--笔记01 ASP.NET Identity 2集成到MVC5项目--笔记02 继上一篇,本篇主要是实现邮件.用户名登陆和登陆前邮件认证. 1. ...
- 使用electron进行原生应用的打包(2)---主进程与渲染进程之间的通信
上一篇讲了使用electron进行打包的配置相关文件,这篇主要讲electron中很重要的通信方式. 首先解释一个概念: electron打包的应用包含两个部分 electron的环境(node),也 ...
- SOE 中调用第三方dll
一.简介 在利用soe实现server的扩展的时候,有些时候,需要调用第三方的dll库.官网中给出了明确的说明,soe中是可以添加第三方的dll文件,但是一直没有测试.按照官方的步骤应该是一个非常的简 ...
- win7下设置smtp的方法
在win7中开启SMTP服务的方法如下: 1. 首先确定是否开启IIS服务:在运行中输入“inetmgr”,若提示出错,则表明未安装.进入步骤2,否则进入步骤3: 2.打开控制面板->程序-&g ...
- 白话Redis分布式锁
redis分布式 简单来说就是,操作redis实例时,不是常规(单机)操作一个实例,而是操作两台或多台,也就是基于分布式集群: 而且redis内部是单进程.单线程,是数据安全的(只有自己的线程在操作数 ...