Scala 的访问权限

1.1 Scala的访问权限概述

  Scala中的属性成员、方法和构造器这三种变量可以通过访问控制符控制访问权限。不同的访问控制符可以决定是否可以被外部类访问。由于局部方法的作用域本身有局限,所以不需要使用访问控制符修饰局部方法。属性成员、方法和构造器的访问控制权限可以通过访问控制符发生变化,而局部变量的访问作用域是不可变的。

  Java中的访问控制符有public、default (默认无修饰符)、protected和private。访问控制权限的级别由小到大的顺序为private、 default、protected、public。private为类访问权限,如果一个成员被private修饰,那么该成员只能在本类中被访问,不可以在外部类或继承类中被访问。default即默认的访问权限为包访问权限,同一个包中的类可以被访问。protected为包访问控制权限加上继承,如果不同的包中存在继承关系,则可以访问不同包中的成员。public表示任何地方都可被访问,访问权限最宽松。

1.2Scala的属性和构造函数访问权限

  通过上面介绍的Java中的访问控制权限,下面学习Scala中的属性和构造函数的访问权限。 Scala中也有四种访问控制权限,分别为:默认访问权限、protected访问权限、private 访问权限和private[ thisl访问权限。Scala中的默认访问权限相当于Java中的public,Scala中如果一个变量没有任何修饰符,就代表默认访问权限。protected访问权限与Java中的不同,只能用于继承关系中,即只能被子类访问。private访问权限与Java中相同,只能在类内部使用。private[this]访问权限是Java中没有的, 只能被类中的某一个对象访问,从这一点也可以看出 Scala 比Java更面向对象。在Java中,访问权限的级别范围由小到大为类、包、继承、all,在Scala中,访问权限的级别范围由小到大为对象、类、继承、 包、all。

通过定义类,分别实现成员属性和构造器的不同访问权限。

(1)默认访问权限。 

(2) protected访问权限。

(3) private访问权限。

(4)private[this]访问权限。

下面举例说明如何实现成员属性的不同访问权限,相关代码如下:”

//访问控制权限//                   类的内部方法  伴生对象中的方法  类的外部(对象.访问)  子类对象.访问  子类方法是否可以访问  另一个对象的属性
//默认权限(public)        可            可             可                可              可               可
//private               可             可            不可              不可             不可             不可
//protected             可             可            不可              不可              可              不可
//private[this]         可             不可          不可               不可             不可             不可
class Student{//1.默认权限。类似于java中的publicval name = "小花"//2.私有属性。类的内部 不能继承!private val score = 59//3.受保护的。protected val car = "宝马"def say(): Unit = {println(name,score,car)}
}object Student{def run(obj:Student): Unit = {println(obj.name,obj.score,obj.car)}
}
//子类
class SubStudent extends Student{def test(): Unit = {println(this.name,this.car)}
}
object Test22_1 {def main(args: Array[String]): Unit = {val s = new Student()//    s.val s1 = new SubStudent()//    s1.}
}

private访问权限输出相关代码如下:

//银行账户存钱取钱例子class BankAccount(private var balance:Int){def showMoney(): Unit = {println(s"现在的余额是:${balance}")}def deposit(money:Int): Unit = {balance += money}def withdraw(money:Int): Unit = {if (money <= balance)balance -= money}//转账def transfer(to: BankAccount,money:Int): Unit = {//A --200--> B//A 减少 B 增加if(money <= balance){//自己减少balance -= money//对方增加to.balance += money}}
}
object Test22_2 {def main(args: Array[String]): Unit = {var xiaoming = new BankAccount(0)var xiaohua = new BankAccount(100)//存入200xiaohua.deposit(200)//取出150xiaohua.withdraw(150)//转账给小明xiaohua.transfer(xiaoming,100)xiaohua.showMoney()xiaoming.showMoney()//    println(xiaohua.balance)}
}

private[this]访问权限输出相关代码如下:

//银行账户存钱取钱例子//private[this]:修饰符,这个属性,只能在当前对象中访问
class BankAccount(private[this] var balance:Int){def showMoney(): Unit = {println(s"现在的余额是:${balance}")}def deposit(money:Int): Unit = {balance += money}def withdraw(money:Int): Unit = {if (money <= balance)balance -= money}//转账:把当前账户的余额转出 money 给 to这个账户def transfer(to: BankAccount,money:Int): Unit = {//A --200--> B//A 减少 B 增加if(money <= balance){//自己减少balance -= money//对方增加
//      to.balance += moneyto.deposit(money)}}
//  def test(to: BankAccount): Unit = {
//    to.balance = 0
//  }
}
object Test22_2 {def main(args: Array[String]): Unit = {var xiaoming = new BankAccount(0)var xiaohua = new BankAccount(100)
//    //存入200
//    xiaohua.deposit(200)
//    //取出150
//    xiaohua.withdraw(150)
//
//    //转账给小明
//    xiaohua.transfer(xiaoming,100)
//
//    xiaohua.showMoney()xiaoming.showMoney()//    println(xiaohua.balance)}
}

1.3 Scala的控制方法作用域

  Scala的控制方法作用域有:默认访问权限、protected访问权限、private访问权限、private[package] 访问权限、private[this]访问权限。实际上 Scala的另外两种变量也有private[package]访问权限,这里主要介绍private[package]访问权限,其中package表示包的名称。如果一个变量使用private[package] 进行修饰,则该变量只能在package包中被访问。private[package]和 private[this]是Scala中特有的访问权限,这两种权限Java中没有。 

通过定义类,实现方法作用域的控制。

(1) 默认问权限。 

(2) protected 访问权限。

(3) private访问权限。 

(4)private[package]访问权限。

相关代码如下:

class Car(){//                   类的内部方法  伴生对象中的方法  类的外部(对象.访问)  子类对象.访问  子类方法是否可以访问  另一个对象的属性//默认权限(public)        可            可             可                可              可               可def run(): Unit = {}def test(): Unit = {run()}
}
class MotoCar() extends Car{def t(): Unit = {this.run()}
}
object Car{def fly(c:Car): Unit = {c.run()}
}
object Test22_3 {def main(args: Array[String]): Unit = {val c1 = new Car()c1.run()val c2 = new MotoCar()c2.run()}
}

private[package]访问权限输出相关代码如下:

//private[p1]:表示。这方法在p1这个包中,是可以访问的。
package p2{class C() {private[p2] def test(): Unit = {println("test")}}object Test22_4 {def main(args: Array[String]): Unit = {var c1 = new C()c1.test()}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准化和归一化

标准化和归一化的概念 **标准化&#xff08;Standardization&#xff09;和归一化&#xff08;Normalization&#xff09;**是两种常见的数据预处理方法&#xff0c;旨在将特征数据转换为具有某种标准尺度的格式&#xff0c;以帮助模型更有效地学习。 1. 标准化&#xff08;S…

Rust移动开发:Rust在Android端集成使用介绍

Andorid调用Rust 目前Rust在移动端上的应用&#xff0c;一般作为应用sdk的提供&#xff0c;供各端使用&#xff0c;目前飞书底层使用Rust编写通用组件。 该篇适合对Android、Rust了解&#xff0c;想看如何做整合&#xff0c;如果想要工程源码&#xff0c;可以评论或留言有解疑…

UE hard/soft reference| DDX DDY | Unity pcg color

目录 1.虚幻引擎性能优化 &#xff08;附0跳转Unity对应机制&#xff09; hard reference and soft reference 1. 硬引用&#xff08;Hard Reference&#xff09; 2. 软引用&#xff08;Soft Reference&#xff09; 3. 使用原则 2.空间梯度转法线 DDX DDY节点 ​编辑 …

嵌入式开发之静态库和共享库

静态库 静态库的特点: 默认执行库链接的时候,检索的是Linux的/lib、/usr/lib目录下,如果指定gcc -c .... -L 指定路径 -l指定库文件;c语言分为预编译、编译、汇编、链接四个步骤。链接的时候是把依赖库文件函数的代码拷贝到程序里面,即便是删除库文件。拷贝后的程序依旧…

【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方

没想到大家这篇文章呼声还挺高 这篇文章是对它的详细实现&#xff0c;建议在阅读本篇之前&#xff0c;先浏览一下前面的文章&#xff0c;以便更好地理解和掌握内容。 这种老派的假反射技术&#xff0c;适合用于移动端或对反射效果的速度和清晰度有较高要求的场合。该技术通过一…

前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)

一、相对定位 使用相对定位的盒子会相对于自身原本的位置&#xff0c;通过偏移指定的距离&#xff0c;到达新的位置。盒子的本体仍处于文档流中。使用相对定位&#xff0c;除了要将 position 属性值设置为 relative 外&#xff0c;还需要指定一定的偏移量。其中&#xff0c;水…

【ChatGPT】让ChatGPT生成跨语言翻译的精确提示

让ChatGPT生成跨语言翻译的精确提示 在跨语言交流中&#xff0c;为了确保翻译的准确性&#xff0c;生成精确的提示&#xff08;Prompt&#xff09;来指导ChatGPT翻译内容是至关重要的。无论是要处理复杂的技术术语、俚语&#xff0c;还是保持特定的语言风格&#xff0c;使用有…

PostgreSQL 页文件损坏

PostgreSQL 提示 ERROR: missing chunk number 0 for toast value 32789 in pg_toast_2619 现象&#xff1a;查询业务表数据提示 ERROR: missing chunk number 0 for toast value 32789 in pg_toast_2619 处理方法&#xff1a;定位到损坏的行的位置&#xff0c;然后删除有问…

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

git 工具原理

git 目录 git git的使用 了解git的三个区域 具体操作 如何下载别人上传到git的工程 -- 可以参考菜鸟教程&#xff0c;包括安装配置git Git 安装配置 | 菜鸟教程 -- Git 是一种分布式版本控制系统&#xff0c;用于管理软件项目的源代码。它是由 Linux 之父 Linus Torval…

VLAN高级+以太网安全

VLAN聚合 MUX VLAN QinQ 以下是这三种VLAN技术的作用及其在项目中的应用实例&#xff1a; VLAN聚合 (VLAN Aggregation) VLAN聚合通常用于将多个VLAN数据聚合到一个物理链路上&#xff0c;以减少链路数量、提高链路利用率。这样可以在一个物理链路上同时传输不同VLAN的数据包&…

前端零基础学习Day-Six

CSS选择器 标签选择器 以HTML标签作为选择器&#xff1a; <style type"text/css"> p,h1,h2,h3,h4{font-size:30px;} p{color:blue;font-family:"隶书";} h1{color:red;} </style> 通过标签选择器设置样式&#xff0c;那使用该标签的内容都引…

springboot集成opencv开源计算机视觉库

最近项目需要用到opencv&#xff0c;网上看到很多资料都是下载安装并且引入jar包与dll文件&#xff0c;感觉很麻烦&#xff0c;不是我想要的&#xff0c;于是花时间折腾了下&#xff0c;不需要任何安装与引入jar包与dll文件&#xff0c;简单方便&#xff0c;快速上手。 先说说…

electron 中 webFrame 作用

1. 理解 Electron 中的 Web 内容呈现 在 Electron 应用中&#xff0c;渲染进程主要负责加载和呈现网页内容&#xff0c;这部分功能与浏览器中的标签页类似。 WebFrame 是 Electron 提供的一个模块&#xff0c;它在**管理和控制这些网页内容的呈现方面**发挥着关键作用。 2. …

Linux操作系统:学习进程_对进程的深入了解

目录 前言 开篇 一、进程概念 二、进程的描述与管理 1、如何描述与管理 2、Linux中的PCB-task_struct 3、对进程组织的理解 三、进程的属性 1、系统创建进程 2、查看进程 3、进程的标识符 4、退出进程 1>ctrlc 2>kill命令杀死进程 5、用户进程的创建方式…

Redis的缓存问题与应对策略

Redis 作为一种高效的缓存系统&#xff0c;在高并发环境下应用广泛&#xff0c;但也面临一些缓存问题&#xff0c;以下是常见问题及其应对策略。 1. 缓存穿透 问题描述 缓存穿透是指请求的数据在缓存和数据库中都不存在&#xff0c;但大量请求直接到达数据库&#xff0c;从而给…

虚拟户分账:电商资金管理的新曙光。

随着电商行业的蓬勃发展&#xff0c;资金管理成为了企业运营的重中之重。传统资金结算方式在面对大规模交易、复杂业务场景时&#xff0c;显得力不从心。在此背景下&#xff0c;电商虚拟户分账系统以其独特的优势&#xff0c;为电商企业带来了资金管理的新曙光。 电商虚拟户分…

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

lora训练模型 打造个人IP

准备工作 下载秋叶炼丹器整理自己的照片下载底膜 https://rentry.org/lycoris-experiments 实操步骤 解压整合包 lora-scripts,先点击“更新” 训练图片收集 比如要训练一个自己头像的模型&#xff0c;就可以拍一些自己的照片&#xff08;20-50张&#xff0c;最少15张&…

IO 多路复用技术:原理、类型及 Go 实现

文章目录 1. 引言IO 多路复用的应用场景与重要性高并发下的 IO 处理挑战 2. IO 多路复用概述什么是 IO 多路复用IO 多路复用的优点与适用场景 3. IO 多路复用的三种主要实现3.1 select3.2 poll3.3 epoll三者对比 4. 深入理解 epoll4.1 epoll 的三大操作4.2 epoll 的核心数据结构…