Scala 中 val 和对象内部状态的关系

在 Scala 中,val 用于声明不可变的变量,这意味着一旦 val 被赋值,它的引用(即指向的内存地址)就不能再改变。然而,这并不影响对象内部的状态(即对象的属性)是否可以改变。具体来说:


1. val 的不可变性

  • val 声明的变量是不可变的,即它的引用(指向的对象)不能被重新赋值。

  • 例如:

    val x = 10
    // x = 20  // 这行会报错reassignment to val,因为 x 是 val,不能重新赋值

  • 如果 val 指向一个对象:

    val person = new Person("Alice", 25)
    // person = new Person("Bob", 30)  // 这行会报错,因为 person 是 val,不能重新赋值


2. 对象内部属性的可变性

  • 虽然 val 的引用不可变,但对象内部的属性是否可变,取决于对象本身的设计。

  • 如果对象的属性是 var,那么这些属性可以被修改。

  • 例如:

    class Person(var name: String, var age: Int)val person = new Person("Alice", 25)
    println(person.name)  // 输出: Alice// 修改对象内部的属性
    person.name = "Bob"
    person.age = 30println(person.name)  // 输出: Bob
    println(person.age)   // 输出: 30

    在这个例子中,person 是一个 val,它的引用不能改变,但 Person 类的属性 name 和 age 是 var,因此可以被修改。


3. 如果对象是不可变的

  • 如果对象的属性是 val,那么对象内部的属性也不能被修改。

  • 例如:

    class Person(val name: String, val age: Int)val person = new Person("Alice", 25)
    println(person.name)  // 输出: Alice// person.name = "Bob"  // 这行会报错,因为 name 是 val,不能修改

    在这个例子中,Person 类的属性 name 和 age 是 val,因此它们的值在对象创建后就不能再改变。


4. 总结

  • val 的不可变性是指引用的不可变性,而不是对象内部状态的不可变性。

  • 如果对象内部的属性是 var,即使对象被 val 引用,这些属性仍然可以被修改。

  • 如果对象内部的属性是 val,那么对象的状态就是完全不可变的。


5. 类比

可以将 val 理解为一个固定的指针(引用),指针指向的对象可以是一个可变的对象(如果对象的属性是 var),也可以是一个不可变的对象(如果对象的属性是 val)。

  • val + 可变对象:指针固定,但对象内容可以变。

  • val + 不可变对象:指针固定,对象内容也不可变。


6. 代码示例

class MutablePerson(var name: String, var age: Int)
class ImmutablePerson(val name: String, val age: Int)// val + 可变对象
val mutablePerson = new MutablePerson("Alice", 25)
mutablePerson.name = "Bob"  // 可以修改
println(mutablePerson.name)  // 输出: Bob// val + 不可变对象
val immutablePerson = new ImmutablePerson("Alice", 25)
// immutablePerson.name = "Bob"  // 这行会报错,因为 name 是 val
println(immutablePerson.name)  // 输出: Alice

通过这种方式,你可以更好地理解 val 和对象内部状态的关系。

(PS:以上结果是查询deepseek的结果,只是作为自己学习的一个记录)

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

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

相关文章

Python学习(十四)pandas库入门手册

目录 一、安装与导入二、核心数据结构2.1 Series 类型(一维数组)2.2 DataFrame 类型(二维数组) 三、数据读取与写入3.1 读取 CSV 和 Excel 文件3.2 写入数据 四、数据清洗与处理4.1 处理缺失值4.2 数据筛选4.3 数据排序 五、数据分…

2025东方财富笔试考什么?cata能力测评攻略|答题技巧真题分享

嘿,各位怀揣金融梦想、准备在 2025 年求职浪潮中大展身手的小伙伴们! 我是职小豚,在求职指导领域摸爬滚打了 10 年,每年都见证着无数求职者为心仪的岗位全力以赴。 一、东方财富:金融科技界的“数据狂魔” 东方财富&…

Ollama+AnythingLLM安装

一、文件准备 ‌ 1. 安装包获取‌ 从联网设备下载: AnythingLLMDesktopInstaller.exe(官网离线安装包)‌ deepseek-r1-1.5b.gguf(1.5B 参数模型文件)‌ 2. ‌传输介质‌ 使用 U 盘或移动硬盘拷贝以下文件至离线设…

java后端开发day27--常用API(二)正则表达式爬虫

(以下内容全部来自上述课程) 1.正则表达式(regex) 可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps:一…

Storm实时流式计算系统(全解)——下

storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类,我们只需要写2个方法和一个main(),一个读取/发射(spout)。 一个拿到数据统计后发到redis…

【0010】Python流程控制结构-分支结构详解

如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢! 本文内容体系结构如下: 分支结构是编程中的基本控制结构之一,它允许程序根据条件判断执行不同的代码路径。通过本文&…

个推助力小米米家全场景智能生活体验再升级

当AI如同水电煤一般融入日常,万物互联的图景正从想象照进现实。作为智能家居领域的领跑者,小米米家凭借开放的生态战略,已连接了超8.6亿台设备,构建起全球领先的消费级AIoT平台。如今,小米米家携手个推,通过…

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…

上海市闵行区数据局调研云轴科技ZStack,共探数智化转型新路径

为进一步深化人工智能、大模型技术的应用,推动区域数字经济高质量发展,2025年2月27日,上海市闵行区数据局局长吴畯率队赴上海云轴科技股份有限公司(以下简称“云轴科技ZStack”)开展专题调研。此次调研旨在深入了解企业…

idea实现热部署

1.在pom.xml文件添加依赖 java <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency> 更新可见配置成功&#xff1a; 2.在appli…

61. Three.js案例-彩色旋转立方体创建与材质应用

61. Three.js案例-彩色旋转立方体创建与材质应用 实现效果 知识点 WebGLRenderer(WebGL渲染器) 构造器 WebGLRenderer( parameters : Object ) 参数类型描述antialiasBoolean是否执行抗锯齿(默认false)alphaBoolean是否包含alpha通道(默认false)方法 setSize( width…

使用JMeter(组件详细介绍+使用方式及步骤)

JSON操作符 在我们使用请求时,经常会遇到JSON格式的请求体,所以在介绍组件之前我会将介绍部分操作符,在进行操作时是很重要的 Operator Description $ 表示根元素 当前元素 * 通配符,所有节点 .. 选择所有符合条件的节点 .name 子元素,name是子元素名称 [start:e…

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器&#xff0c;主要用于运行 Servlet 和 JSP&#xff08;JavaServer Pages&#xff09;程序。它属于轻量级应用服务器&#xff0c;适用于中小型系统及开发调试场景&#xff0c;尤其在处理动态内容&#xff08;如 Jav…

快速开始React开发(一)

快速开始React开发&#xff08;一&#xff09; React是一个JavaScript库&#xff0c;用于构建交互式网站&#xff0c;并且能够快捷创建SPA&#xff08;Single Page App&#xff09;&#xff0c;其组件化的思想也是被一再传播&#xff0c;无论是普通的Web网站还是嵌入移动端交互…

安装nvidia-docker 和设置docker 镜像源

Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 可以先参考官方文档 下面的操作具体和官方文档类似 curl -fsSL https://mirrors.ustc.edu.cn/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-ke…

C++第二节:C/C++内存管理

1.C/C内存分布 【说明】 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存&#xff0c;做进程间通信。堆用于程序运行时动态内存分…

rust编程实战:实现3d粒子渲染wasm

源码 纯js实现 fps&#xff1a; wasm实现 通过对比可以看出来 wasm 实现的计算比纯js刷新相对稳定。

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本&#xff0c;分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内&#xff0c;2025年01月01日起&#xff0c;不支持新产品基于老分支&#xff08;OpenHar…

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

23种设计模式一览【设计模式】

文章目录 前言一、创建型模式&#xff08;Creational Patterns&#xff09;二、结构型模式&#xff08;Structural Patterns&#xff09;三、行为型模式&#xff08;Behavioral Patterns&#xff09; 前言 设计模式是软件工程中用来解决特定问题的一组解决方案。它们是经过验证…