详解 Scala 的变量、标识符、数据类型

一、注释

Scala 注释与 Java 一致

// 单行注释/** 多行注释*//*** 文档注释*/

二、变量与常量

1. 语法

// 变量,类型可以省略
var varName:varClass = value
// 常量,类型可以省略
val valName:valClass = value

2. 案例

// 使用 var/val 才会在类中声明属性,否则只是参数
class Student(name:String, var age:Int) { def printInfo():Unit = {println(name + "," + age + "," + Student.school)}
}object TestVariable {def main(args: Array[String]): Unit = {// 定义变量和常量的通用语法var a: Int = 10val b: String = "James"// 声明变量时,类型可以省略,编译器自动推导,即类型推导var a1 = 10// 变量类型确定后,就不能修改,Scala 是强数据类型语言var a2 = 20// a2 = "Bob"  // 报错// 变量声明时,必须要有初始值// var a3: Int   // 报错// var 修饰的变量可改变,val 修饰的变量不可改val b1 = 30// b1 = 25 // 报错// var 修饰的对象引用可以改变,val 修饰的对象不可改变,但对象的属性可以改变var tom = new Student("Tom", 20)tom = new Student("tom", 18)val rose = new Student("rose", 16)// rose = new Student("Rose", 18) // 报错rose.age = 18// rose.name = "Rose" // 报错}
}

三、标识符

Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符

1. 规则

  • 第一类:以字母或者下划线开头,后接字母、数字、下划线

  • 第二类:以操作符开头,且只包含操作符(+ - * / # !等)

  • 第三类:用反引号 `` 包括的任意字符串,即使是 Scala 关键字(39 个)也可以

    package, import, class, object, trait, extends, with, type, for
    private, protected, abstract, sealed, final, implicit, lazy, override
    try, catch, finally, throw 
    if, else, match, case, do, while, for, return, yield
    def, val, var 
    this, super
    new
    true, false, null
    

2. 案例

object TestIdentifier {def main(args: Array[String]): Unit = {// 以字母或者下划线开头,后接字母、数字、下划线var hello = "hello"var hello123 = "hello123"var _hello = "_hello"// var h-b = 10 // 报错// var 123abc = 20 // 报错// 以操作符开头,且只包含操作符(+ - * / # !等)var -+/% = 30println(-+/%)// var -a+4/b = 30 // 报错// 用反引号 `` 包括的任意字符串var `class` = "class"println(`class`)// var class = "class" // 报错}
}

四、字符串输出

object TestString {def main(args: Array[String]): Unit = {// 字符串通过 + 或 * 号拼接var name = "James"var age = 37println(age + "岁的" + name + "还在征战 NBA")println(name * 4) //字符串复制拼接// printf 将字符串格式输出,通过 % 占位传值printf("%d岁的%s还在征战 NBA", age, name)println()// 字符串模板(插值字符串):通过 $ 获取变量值// s"${var}"println(s"${age}岁的${name}还在征战 NBA")// f"${var}%":格式化模板字符串var num = 2.3456 // 默认 Double 类型println(f"The number is ${num}%2.2f") // The number is 2.35,保留两位小数// raw"${}":保留原始格式输出println(raw"The number is ${num}%2.2f") // The number is 2.3456%2.2f// 三引号模板字符串:保持多行字符串的原格式输出,s""" """val sql = s"""|select| name,| age|from student |where name = ${name}|and age > ${age}""".stripMarginprintln(sql)}
}

五、控制台输入

1. 语法

// 使用 scala.io 包下的 StdIn 类的方法
StdIn.readLine()
StdIn.readInt()

2. 案例

import scala.io.StdInobject TestStdIn {def main(args: Array[String]): Unit = {println("请输入姓名:")val name = StdIn.readLine()println("请输入年龄:")val age = StdIn.readInt()println(s"欢迎${age}岁的${name}")}
}

六、读写文件

import scala.io.Sourceobject TestStdIn {def main(args: Array[String]): Unit = {// 读取文件数据Source.fromFile("src/main/resources/test.txt").foreach(print)// 写入数据到文件,使用 Java 的类库val writer = new PrintWriter(new File("src/main/resources/output.txt"))writer.write("hello scala from java writer")writer.close()}
}

七、数据类型

在这里插入图片描述

  • Scala 中一切数据都是对象,都是 Any 的子类
  • Scala 中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象
  • Scala 数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)
  • Scala 中的 StringOps 是对 Java 中 String 的增强
  • Unit:对应 Java 中的 void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是()。void 不是数据类型,只是一个关键字
  • Null是一个类型,只有一个对象就是 null。它是所有引用类型(AnyRef)的子类
  • Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,这样可以把抛出的返回值,返回给任何的变量或者函数

1.整数类型

  • 分类:

    类型描述
    Byte[1]8 位有符号补码整数。数值区间为 -128 到 127
    Short[2]16 位有符号补码整数。数值区间为 -32768 到 32767
    Int[4]32 位有符号补码整数。数值区间为 -2147483648 到 2147483647
    Long[8]64 位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2 的(64-1)次方-1
  • 案例:

    object TestDataType {def main(args: Array[String]): Unit = {//  正确var n1: Byte = 127var n2: Byte = -128//  错误// var n3:Byte = 128// var n4:Byte = -129// 整数默认为 Intval a1 = 10// 数值范围超过 Int,则需要声明为 Long 型且必须后加 l 或 L(建议)val a2: Long = 9223372036854775807L// 不同类型计算val a3: Byte = (10 + 20) // IDEA报错,但可以正确运行val a4: Byte = 10// val a5: Byte = (a4 + 20) // 运行报错val a6: Byte = (a4 + 20).toByte}
    }
    

2. 浮点类型

  • 分类:

    类型描述
    Float[4]32 位, IEEE 754 标准的单精度浮点数
    Double[8]64 位 IEEE 754 标准的双精度浮点数
  • 案例:

    object TestDataType {def main(args: Array[String]): Unit = {// 浮点数默认为 Doubleval d1 = 3.1415// 声明 Float 型常量,须后加 f 或 Fvar f1: Float = 2.2345678912f// var f2: Float = 2.2345678912 //报错}
    }
    

3. 字符类型

  • 说明:字符类型 Char 表示单个字符

  • 案例:

    object TestDataType {def main(args: Array[String]): Unit = {// 字符常量是用单引号 '' 括起来的单个字符val c1: Char = 'a'val c2 = '9'// 控制字符val c3 = '\t' // 制表符val c4 = '\n' // 换行符// 转义字符val c5 = '\\' // 表示 \val c5 = '\""' // 表示 ""// 字符类型底层保存的 ASCII 码值val i1: Int = c1 // 97val i2: Int = c2 // 57}
    }
    

4. 布尔类型

  • 说明:

    • 布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
    • Boolean 类型占 1 个字节
  • 案例:

    object TestDataType {def main(args: Array[String]): Unit = {var isResult : Boolean = falsevar isResult2 : Boolean = true}
    }
    

5. Unit/Null/Nothing 类型

  • 说明

    类型说明
    Unit表示无值,和 Java 语言中 void 等同。用作不返回任何结果的方法的结果类型。Unit 只有一个实例值,写成 ()
    Nullnull , Null 类型只有一个实例值 null
    NothingNothing 类型在 Scala 的类层级最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用 Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)
  • 案例

    object TestDataType {def main(args: Array[String]): Unit = {// 1.空值 Unitdef m1(): Unit = {println("m1 被调用")}val a: Unit = m1()println("a:" + a) // a:()// 2.空引用 Null// val b: Int = null // 报错var stu: Student = new Student("tom", 18)stu = nullprintln("stu:" + stu) // stu:null// 3.Nothingdef m2(n: Int): Nothing = {throw new NullPointerException}}
    }
    

八、类型转换

1. 自动类型转换

在这里插入图片描述

  • 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算
  • 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换
  • (Byte, Short) 和 Char 之间不会相互自动转换
  • Byte,Short,Char 三者可以计算,在计算时首先转换为 Int 类型
  • 虽然 Byte 可以自动提升为 Short 精度,但是二者在运算时必须提升为 Int
object TestValueTransfer {def main(args: Array[String]): Unit = {//(1)自动提升原则var n = 1 + 2.0println(n) // n 类型是 Double//(2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换var n2 : Double= 1.0//var n3 : Int = n2 //错误,原因不能把高精度的数据直接赋值和低精度//(3)(byte,short)和 char 之间不会相互自动转换var n4 : Byte = 1//var c1 : Char = n4 //错误var n5: Int = n4//(4)byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型var n6: Byte = 1var n7: Short = 2var c2: Char = 1// var n : Short = n6 + c2 + n7 // n6 + c2  结果类型是 int// var n8 : Short = n6 + n7 // 错误}
}

2. 强制类型转换

  • 将数据由高精度转换为低精度,就需要使用到强制转换,但存在精度损失或数据溢出
  • 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
object TestDataTypeConversion {def main(args: Array[String]): Unit = {val a: Int = 10// val a1: Byte = a // 报错val a1: Byte = a.toByte  // 调用转换方法:toShort/toInt/toLong.....}
}object TestType {def main(agrs: Array[String]): Unit = {// 强制类型转换数据溢出val n: Int = 130val b: Byte = n.toByteprintln("b:" + b) // -126/*解析:8421码Int 类型的 130 在底层的存储(4 字节,32 位):原码:0000 0000 0000 0000 0000 0000 1000 0010反码:0000 0000 0000 0000 0000 0000 1000 0010补码:0000 0000 0000 0000 0000 0000 1000 0010Int转Byte:1 字节,8 位补码:1000 0010反码:1000 0001原码:1111 1110-126*/}
}

3. 数值与String转换

object TestNumAndStringConversion {def main(agrs: Array[String]): Unit = {// 1.数值转Stringval a: Int = 3val str: String = a + ""// 2.String转数值var s1 : String = "12"var s2 : String = "12.3"var n1 : Byte = s1.toBytevar n2 : Short = s1.toShortvar n3 : Int = s1.toIntvar n4 : Long = s1.toLong// var n5: Int = s2.toInt // 运行抛 NumberFormatException// var nn5: Int = "hello".toInt // 报错var n6: Double = s2.toDouble}
}

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

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

相关文章

嵌入式学习记录5.18(多点通信)

一、套接字属性设置相关函数 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname,const void *op…

【跟着例子学MySQL】多表关联 -- 一对一关系

文章目录 前言回顾一对一关系备份恢复未完待续 前言 举例子&#xff0c;是最简单有效的学习方法。本系列文章以一个贯穿始终的场景&#xff0c;结合多个实例讲解MySQL的基本用法。 ❔ 为什么要写这个系列&#xff1f; 模仿是最好的老师&#xff0c;实践是检验成果的方法。本系…

ABAP 借助公司封装的钉钉URL,封装的RFC给钉钉发送消息

FUNCTION ZRFC_BC_SMSSEND_DINGTALK. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" VALUE(DESTUSRID) TYPE CHAR255 *" VALUE(CONTENT) TYPE CHAR255 *&quo…

企业如何实现数据采集分析展示一体化

在当今数字化时代&#xff0c;企业越来越依赖于数据的力量来驱动决策和创新。通过全量实时采集各类数据&#xff0c;并利用智能化工具进行信息处理&#xff0c;企业能够借助大数据分析平台深入挖掘数据背后的价值&#xff0c;从而为企业发展注入新动力。 一、企业痛点 随着数字…

使用uniapp编写的微信小程序进行分包

简介&#xff1a; 由于小程序发布的时候每个包最多只能放置2MB的东西&#xff0c;所以把所有的代码资源都放置在一个主包当中不显示&#xff0c;所以就需要进行合理分包&#xff0c;&#xff0c;但是分包后整个小程序最终不能超过20MB。 一般情况下&#xff0c;我习惯将tabba…

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

C#中的事件聚合器实现方法

概述&#xff1a;_对象之间的关系_是使代码库难以理解和难以维护的原因。为了更好地理解它&#xff0c;我们求助于马丁福勒&#xff08;Martin Fowler&#xff09;&#xff1a;事件聚合器是间接的简单元素。在最简单的形式中&#xff0c;您可以让它注册到您感兴趣的所有源对象&…

elastich运维

Elastichsearch是一种高度可扩展的开源全文搜索和分析引擎&#xff0c;可以用来实现快速、高效的数据检索。 集群规划与部署&#xff1a;首先需要根据业务需求规划Elastichsearch集群的节点数量和角色&#xff08;如主节点、副本节点、协调节点等&#xff09;。在部署时&#x…

VMware Workstation 不可恢复错误:(vmui) 错误代码0xc0000094

软件版本 vmware 17 错误情况 VMware Workstation 不可恢复错误&#xff1a;(vmui) Exception 0xc0000094 has occurred. 问题原因 VMware升级到17.0后&#xff0c;将虚拟机环境的【硬件兼容性】升级至Workstation 17.X后&#xff0c;无法修改设备参数。 解决办法 打开需…

企业营收分析难?搞定收入认领月底不加班!

在当今日益激烈的市场竞争中&#xff0c;企业的营收分析不仅是衡量经营成果的关键指标&#xff0c;更是指导企业未来发展的重要依据。然而&#xff0c;对于许多企业来说&#xff0c;营收分析的过程往往繁琐且耗时&#xff0c;尤其是月底结账时&#xff0c;大量的数据和复杂的计…

医疗图像处理2023:Transformers in medical imaging: A survey

医学成像中的transformer:综述 目录 一、介绍 贡献与安排 二、CNN和Transformer 1.CNN 2.ViT 三、Transformer应用于各个领域 1.图像分割 1&#xff09;器官特异性 ①2D ②3D 2&#xff09;多器官类别 ①纯transformer ②混合架构 单尺度 多尺度 3&#xff09;…

fyne表单布局

fyne表单布局 layout.FormLayout就像一个 2 列网格布局 。 package mainimport ("image/color""fyne.io/fyne/v2/app""fyne.io/fyne/v2/canvas""fyne.io/fyne/v2/container""fyne.io/fyne/v2/layout" )func main() {myApp…

Wpf 使用 Prism 实战开发Day27

首页汇总和数据动态显示 一.创建首页数据汇总数据接口 汇总&#xff1a;待办事项的总数已完成&#xff1a;待办事项里面有多少条完成的待办完成比例&#xff1a;已完成和汇总之间的比例备忘录&#xff1a;显示备忘录的总数待办事项&#xff1a;显示待办事项未完成的集合备忘录&…

②单细胞学习-组间及样本细胞比例分析

目录 数据读入 每个样本各细胞比例 两个组间细胞比例 亚组间细胞比例差异分析&#xff08;循环&#xff09; 单个细胞类型亚新间比例差异 ①单细胞学习-数据读取、降维和分群-CSDN博客 比较各个样本间的各类细胞比例或者亚组之间的细胞比例差异 ①数据读入 #各样本细胞…

三、Ollama导入大模型(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

Ollama导入大模型 一、导入Ollama大模型1、使用run命令2、使用Modelfile方式 二、导入自定义大模型&#xff08;Ollama官网以外的大模型&#xff09;三、使用OpenWebUI导入大模型 Ollama可以导入官方提供的大模型&#xff0c;也可以导入huggingface上的自定义大模型&#xff08…

【加密与解密(第四版)】第十四章笔记

第十四章 漏洞分析技术 14.1 软件漏洞原理 缓冲区溢出漏洞&#xff1a;栈溢出 堆溢出、整型溢出&#xff08;存储溢出、计算溢出、符号问题&#xff09; UAF&#xff08;Use-After-Free&#xff09;漏洞 14.2 ShellCode 功能模块&#xff1a;下载执行、捆绑、反弹shell 14.3 …

【NumPy】使用NumPy计算相关系数:详解numpy.corrcoef函数及应用

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

基础8 探索JAVA图形编程桌面:邮件操作组件详解

在一个静谧的午后&#xff0c;卧龙和凤雏相邀来到一家古朴典雅的茶馆。茶馆内环境清幽&#xff0c;袅袅的茶香与悠扬的古筝声交织在一起&#xff0c;营造出一种宁静而祥和的氛围。 卧龙和凤雏坐在茶馆的一角&#xff0c;面前的桌子上摆放着一套精致的茶具。茶香四溢&#xff0c…

C++ STL 中的自定义比较:深入理解相等和等价

STL 中的自定义比较、相等和等价 一、简介二、STL 的排序部分三、STL 的未排序部分四、比较元素五、实现比较器六、总结 一、简介 本文主要讨论了在 STL 中使用自定义比较函数&#xff0c;以及比较操作中的相等和等价概念。 有如下的代码&#xff1a; std::vector< std::…

【C++】牛客——活动安排

✨题目链接&#xff1a; AB31 活动安排 ✨题目描述 给定&#x1d45b;个活动&#xff0c;每个活动安排的时间为[&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;)。求最多可以选择多少个活动&#xff0c;满足选择的活动时间两两之间没有重合。 ✨输入描述: 第一行…