爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      scala教程之:可见性规则

      首页 知识中心 其他 文章详情页

      scala教程之:可见性规则

      2023-03-24 10:31:00 阅读次数:469

      scala

      文章目录

      • ​​public​​
      • ​​Protected​​
      • ​​private​​
      • ​​scoped private 和 scoped protected​​

      和java很类似,scala也有自己的可见性规则,不同的是scala只有private和protected关键字,没有public关键字,同时scala还提供了更加细粒度的访问控制如protected[scope]和private[scope]。

       

      public

      scala中默认的访问权限就是public,这意味着在scala中没有可见性关键字的声明体,他的访问权限就是public,是具有公有可见性的。这与Java不同,Java 语言中默认的“公有”可见性只对包可见(即包内私有)。

      我们看一个例子:

      package scopeA {
      class PublicClass1 {
      val publicField = 1
      class Nested {
      val nestedField = 1
      }
      val nested = new Nested
      }
      class PublicClass2 extends PublicClass1 {
      val field2 = publicField + 1
      val nField2 = new Nested().nestedField
      }
      }
      package scopeB {
      class PublicClass1B extends scopeA.PublicClass1
      class UsingClass(val publicClass: scopeA.PublicClass1) {
      def method = "UsingClass:" +
      " field: " + publicClass.publicField +
      " nested field: " + publicClass.nested.nestedField
      }
      }

       

      我们可以看到PublicClass1和它的内部类Nested的字段是公有可以访问的。

      Protected

      所有使用protected 关键字声明的成员只对该定义类型可见,包括

      相同类型的其他实例以及所有的继承类型。

      我们看一个例子:

      package scopeA {
      class ProtectedClass1(protected val protectedField1: Int) {
      protected val protectedField2 = 1

      def equalFields(other: ProtectedClass1) =
      (protectedField1 == other.protectedField1) &&
      (protectedField2 == other.protectedField2) &&
      (nested == other.nested)


      class Nested {
      protected val nestedField = 1
      }

      protected val nested = new Nested
      }

      class ProtectedClass2 extends ProtectedClass1(1) {
      val field1 = protectedField1
      val field2 = protectedField2
      val nField = new Nested().nestedField // ERROR
      }

      class ProtectedClass3 {
      val protectedClass1 = new ProtectedClass1(1)
      val protectedField1 = protectedClass1.protectedField1 // ERROR
      val protectedField2 = protectedClass1.protectedField2 // ERROR
      val protectedNField = protectedClass1.nested.nestedField // ERROR
      }

      protected class ProtectedClass4

      class ProtectedClass5 extends ProtectedClass4
      protected class ProtectedClass6 extends ProtectedClass4
      }

      package scopeB {
      class ProtectedClass4B extends scopeA.ProtectedClass4 // ERROR
      }

       

      由于ProtectedClass2 继承了Protected1 类,因此ProtectedClass2 能访问ProtectedClass1中定义的受保护成员。不过,ProtectedClass2 无法访问protectedClass1.nested 对象中受保护的nestedField 成员。同时,ProtectedClass3 类也无法访问它使用的ProtectedClass1实例中的受保护成员。

      最后,由于ProtectedClass4 被声明为protected 类,其对scopeB 包内的对象不可见。

      private

      私有(private)可见性将实现细节完全隐藏起来,即便是继承类的实现者也无法访问这些细节。声明中包含了private 关键字的所有成员都只对定义该成员的类型可见,该类型的其他实例也能访问这些成员。

       

      注意,虽然private的继承者无法访问成员,但是包含该字段的类型的其他实例也可以访问这些成员。

       

      举个例子:

      package scopeA {
      class PrivateClass1(private val privateField1: Int) {
      private val privateField2 = 1

      def equalFields(other: PrivateClass1) =
      (privateField1 == other.privateField1) &&
      (privateField2 == other.privateField2) &&
      (nested == other.nested)

      class Nested {
      private val nestedField = 1
      }

      private val nested = new Nested
      }

      class PrivateClass2 extends PrivateClass1(1) {
      val field1 = privateField1 // ERROR
      val field2 = privateField2 // ERROR
      val nField = new Nested().nestedField // ERROR
      }

      class PrivateClass3 {
      val privateClass1 = new PrivateClass1(1)
      val privateField1 = privateClass1.privateField1 // ERROR
      val privateField2 = privateClass1.privateField2 // ERROR
      val privateNField = privateClass1.nested.nestedField // ERROR
      }

      private class PrivateClass4

      class PrivateClass5 extends PrivateClass4 // ERROR
      protected class PrivateClass6 extends PrivateClass4 // ERROR
      private class PrivateClass7 extends PrivateClass4
      }

      package scopeB {
      class PrivateClass4B extends scopeA.PrivateClass4 // ERROR
      }

       

      其他的都很好解释, 请注意,​equalFields 方法可以访问其他实例中定义的私有成员​。

      scoped private 和 scoped protected

      除了普通的public,private和protected这三种可见性外,scala还提供了范围内的可见性: scoped private 和 scoped protected。 scala的范围有this,package和具体的某个类型。

      简单点讲范围内的可见性就是在范围内保持该可见性的特性。

      我们可以比较一下上面我们在讲private和proteced可见性的时候,两者在范围内(class,package)的表现是一样的,是可以替换的,只有在继承方面有差异。

      我们先看一下继承的差异性:

      package scopeA {
      class Class1 {
      private[scopeA] val scopeA_privateField = 1
      protected[scopeA] val scopeA_protectedField = 2
      private[Class1] val class1_privateField = 3
      protected[Class1] val class1_protectedField = 4
      private[this] val this_privateField = 5
      protected[this] val this_protectedField = 6
      }

      class Class2 extends Class1 {
      val field1 = scopeA_privateField
      val field2 = scopeA_protectedField
      val field3 = class1_privateField // ERROR
      val field4 = class1_protectedField
      val field5 = this_privateField // ERROR
      val field6 = this_protectedField
      }
      }

      package scopeB {
      class Class2B extends scopeA.Class1 {
      val field1 = scopeA_privateField // ERROR
      val field2 = scopeA_protectedField
      val field3 = class1_privateField // ERROR
      val field4 = class1_protectedField
      val field5 = this_privateField // ERROR
      val field6 = this_protectedField
      }
      }

       

      scope private/protected只能在该scope内部满足private/protected条件时候才能访问,这样就提供了更加细粒度的控制。

      其中this scope是最严格的可见性,它表明可见性限制的字段只能在当前的scope或者type范围之内。

      package scopeA {
      class PrivateClass1(private[this] val privateField1: Int) {
      private[this] val privateField2 = 1
      def equalFields(other: PrivateClass1) =
      (privateField1 == other.privateField1) && // 错误
      (privateField2 == other.privateField2) && // 错误
      (nested == other.nested) // 错误
      class Nested {
      private[this] val nestedField = 1
      }
      private[this] val nested = new Nested
      }
      class PrivateClass2 extends PrivateClass1(1) {
      val field1 = privateField1 // 错误
      val field2 = privateField2 // 错误
      val nField = new Nested().nestedField // 错误
      }
      class PrivateClass3 {
      val privateClass1 = new PrivateClass1(1)
      val privateField1 = privateClass1.privateField1 // 错误
      val privateField2 = privateClass1.privateField2 // 错误
      val privateNField = privateClass1.nested.nestedField // 错误
      }
      }

       

      我们先看一下类型范围的private[this], 因为其是特定类型范围内,所以equalFields方法会编译错误,其无法被其他实例所访问。

      除此之外,使用private[this] 修饰的类成员的可见性与未指定作用域范围的private 可见性一致。

      再看一下包范围内的private[this] :

      package scopeA {
      private[this] class PrivateClass1
      package scopeA2 {
      private[this] class PrivateClass2
      }
      class PrivateClass3 extends PrivateClass1 // 错误
      protected class PrivateClass4 extends PrivateClass1 // 错误
      private class PrivateClass5 extends PrivateClass1
      private[this] class PrivateClass6 extends PrivateClass1
      private[this] class PrivateClass7 extends scopeA2.PrivateClass2 // 错误
      }
      package scopeB {
      class PrivateClass1B extends scopeA.PrivateClass1 // 错误
      }

       

      在相同包中,无法成功地为一个private[this] 类型声明public 或protected 子类,你只能为其声明private 和private[this] 子类。与此同时,由于PrivateClass2 的可见性被限定在scopeA2 作用域内,因此你无法在scopeA2 作用域外声明其子类。

      同理,在与scopeA2无关的scopeB 作用域内使用PrivateClass1 声明类同样会失败。

      我们再看下private[T] 的可见性,其中T 代表了某一类型

      package scopeA {
      class PrivateClass1(private[PrivateClass1] val privateField1: Int) {
      private[PrivateClass1] val privateField2 = 1

      def equalFields(other: PrivateClass1) =
      (privateField1 == other.privateField1) &&
      (privateField2 == other.privateField2) &&
      (nested == other.nested)

      class Nested {
      private[Nested] val nestedField = 1
      }

      private[PrivateClass1] val nested = new Nested
      val nestedNested = nested.nestedField // ERROR
      }

      class PrivateClass2 extends PrivateClass1(1) {
      val field1 = privateField1 // ERROR
      val field2 = privateField2 // ERROR
      val nField = new Nested().nestedField // ERROR
      }

      class PrivateClass3 {
      val privateClass1 = new PrivateClass1(1)
      val privateField1 = privateClass1.privateField1 // ERROR
      val privateField2 = privateClass1.privateField2 // ERROR
      val privateNField = privateClass1.nested.nestedField // ERROR
      }
      }

       

      由于可见性类型为private[PrivateClass1] 的成员对其他同类型实例可见, 因此equalFields 能够通过解析。

      我们再看看包级的可见性:

      package scopeA {
      private[scopeA] class PrivateClass1

      package scopeA2 {
      private [scopeA2] class PrivateClass2
      private [scopeA] class PrivateClass3
      }

      class PrivateClass4 extends PrivateClass1
      protected class PrivateClass5 extends PrivateClass1
      private class PrivateClass6 extends PrivateClass1
      private[this] class PrivateClass7 extends PrivateClass1

      private[this] class PrivateClass8 extends scopeA2.PrivateClass2 // ERROR
      private[this] class PrivateClass9 extends scopeA2.PrivateClass3
      }

      package scopeB {
      class PrivateClass1B extends scopeA.PrivateClass1 // ERROR
      }

       

      现在我们无法在scopeA2 作用域外将PrivateClass2 子类化。不过由于PrivateClass3 被声明为private[ScopeA] 类型,因此我们可以在scopeA 作用域内能将PrivateClass3 子类化。

      再看看放在类型里面的包级可见性:

      package scopeA {
      class PrivateClass1(private[this] val privateField1: Int) {
      private[this] val privateField2 = 1

      def equalFields(other: PrivateClass1) =
      (privateField1 == other.privateField1) && // ERROR
      (privateField2 == other.privateField2) && // ERROR
      (nested == other.nested) // ERROR

      class Nested {
      private[this] val nestedField = 1
      }

      private[this] val nested = new Nested
      }

      class PrivateClass2 extends PrivateClass1(1) {
      val field1 = privateField1 // ERROR
      val field2 = privateField2 // ERROR
      val nField = new Nested().nestedField // ERROR
      }

      class PrivateClass3 {
      val privateClass1 = new PrivateClass1(1)
      val privateField1 = privateClass1.privateField1 // ERROR
      val privateField2 = privateClass1.privateField2 // ERROR
      val privateNField = privateClass1.nested.nestedField // ERROR
      }
      }

      如果我们试图从某个与scopeA 无关的包scopeB 中访问scopeA 时,或者当我们尝试从嵌套包scopeA2 中访问成员变量时,便会出现错误。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/flydean/2720032,作者:程序那些事,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:openstack学习-登陆Openstack CLI

      下一篇:Docker Swarm 快速入门

      相关文章

      2025-03-31 08:49:38

      scala面向接口编程彻底实战和spark源码鉴赏

      scala面向接口编程彻底实战和spark源码鉴赏

      2025-03-31 08:49:38
      scala , spark , 接口 , 源码
      2024-06-26 06:22:23

      Spark使用Atlas的时候报错

      Spark使用Atlas的时候报错

      2024-06-26 06:22:23
      scala , version
      2024-06-05 08:24:41

      202_Spark编程工具:使用IDEA

      202_Spark编程工具:使用IDEA

      2024-06-05 08:24:41
      idea , scala , spark
      2024-04-23 09:44:00

      Spark-Scala

      Spark-Scala

      2024-04-23 09:44:00
      html , Kafka , scala
      2024-04-23 09:44:00

      Scala mutable.Map可变的Map

      Scala mutable.Map可变的Map

      2024-04-23 09:44:00
      scala , Scala
      2023-08-04 08:44:32

      scala之隐式转换(类、方法、属性)

      隐式转换可以再不需改任何代码的情况下,扩展某个类的功能。 隐式方法 例如java里面的String类就存在于jdk里面,除非你反编译St

      2023-08-04 08:44:32
      scala
      2023-07-25 08:30:47

      Scala-模式匹配

      Scala-模式匹配

      2023-07-25 08:30:47
      scala , 后端
      2023-07-04 07:08:30

      Kafka + spark stream +redis (createStream + createDirectStream)

      我们的应用场景是分析用户使用手机App的行为,描述如下所示: 1、手机客户端会收集用户的行为事件(我们以点击事件为例),将数据发送到数据服务器,我们假设这里直接进入到Kafka消息队列 2、后端的实时服务会从Kafka消费数据,将数据读出来

      2023-07-04 07:08:30
      redis , scala , zookeeper
      2023-06-20 09:13:20

      Spark Core:Scala单词计数

      1、实验描述 利用Scala语言开发Spark WordCount程序实验时长:45分钟主要步骤:创建spark项目编写wordcoun

      2023-06-20 09:13:20
      hadoop , scala , spark
      2023-04-23 09:44:23

      大数据spark 蘑菇云行动前传 第1课:大数据时代的黄金语言scala

      大数据spark 蘑菇云行动前传 第1课:大数据时代的黄金语言scala 1 jvm的企业级霸主地位和今日java 2 黄金语言scal

      2023-04-23 09:44:23
      scala , spark , 大数据
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5236925

      查看更多

      最新文章

      Spark使用Atlas的时候报错

      2024-06-26 06:22:23

      Scala mutable.Map可变的Map

      2024-04-23 09:44:00

      Scala-模式匹配

      2023-07-25 08:30:47

      Spark Core:Scala单词计数

      2023-06-20 09:13:20

      查看更多

      热门文章

      Spark Core:Scala单词计数

      2023-06-20 09:13:20

      Scala-模式匹配

      2023-07-25 08:30:47

      Scala mutable.Map可变的Map

      2024-04-23 09:44:00

      Spark使用Atlas的时候报错

      2024-06-26 06:22:23

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Scala mutable.Map可变的Map

      Spark使用Atlas的时候报错

      Spark Core:Scala单词计数

      Scala-模式匹配

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号