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

news2024/11/27 22:31:50

一、注释

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 = 10
        val 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 -+/% = 30
        println(-+/%)
        
        // 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 = 37
        println(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}
                """.stripMargin
        println(sql)
        
    }
}

五、控制台输入

1. 语法

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

2. 案例

import scala.io.StdIn

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

六、读写文件

import scala.io.Source

object 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 = 127
            var n2: Byte = -128
            
            //  错误
            // var n3:Byte = 128
            // var n4:Byte = -129
            
            // 整数默认为 Int
            val 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 = {
            // 浮点数默认为 Double
            val d1 = 3.1415
            
            // 声明 Float 型常量,须后加 f 或 F
            var 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 // 97
            val i2: Int = c2 // 57
        }
    }
    

4. 布尔类型

  • 说明:

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

    object TestDataType {
        def main(args: Array[String]): Unit = {
            var isResult : Boolean = false
    		var 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.空值 Unit
            def 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 = null
            println("stu:" + stu) // stu:null
            
            // 3.Nothing
            def 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.0
        println(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 = 1
        var n7: Short = 2
        var 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 = 130
        val b: Byte = n.toByte
        println("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 0010
          
          Int转Byte:1 字节,8 位
          补码:1000 0010
          反码:1000 0001
          原码:1111 1110
          -126
        */
    }
}

3. 数值与String转换

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

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

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

相关文章

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图…

线性插值的频域特性

1、抽取和插值的简单说明 抽取和插值是变采样过程中常用的两种手段,其中抽取的目的是降低数据的采样率,以降低对系统存储深度或计算量的要求。插值的目的是提高数据的采样率,以提高系统的计算精度。 M M M倍抽取通常是通过每隔 M M M…

卧槽!这项目开源了!【送源码 】

随着科技的飞速发展,个人财务管理变得越来越重要。一个名为‘Maybe’的创新型个人财务与财富管理应用程序随之诞生,它以其丰富的功能和用户友好的界面受到了广大用户的关注。 现在项目方将这个价值 100万美元的个人理财应用项目开源了 Maybe Maybe应用…

利用cherry pick巧妙地将某次提交单独合并到其他分支

0. 引言 最近在进行系统的多版本并行开发,涉及一些共有基础功能提交时就遇到了麻烦,一份代码需要向多个版本分支进行同步,以保证多版本都能有更新该基础功能。 多次对比提交的方式显然会带来巨大的工作量。但实际上我们可以通过git的cherry…

5,串口编程---实现简单的用串口发送接收数据

单片机通过串口向PC机发送数据 PC机通过串口接收单片机发过来的数据 1.UART和USART的区别: USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式 本开发板STM32F103ZET6有5个串口,用串口1作调试串口,因为串…

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成: // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库,且该文件夹下会有多个项目 首先在当前文件夹下新建git…

网工内推 | 高校、外企网工,IE认证优先,年薪最高18w

01 上海外国语大学贤达经济人文学院 🔷招聘岗位:高校网络主管 🔷职责描述: 1、负责总机房、网络规划及管理,包括容量规划、成本评估、建设管理等; 2、负责设计、实施及维护全网络架构及规划网络变更计划 3、负责网络功…

什么是“SQL注入攻击”?如何预防和应对?

一、SQL注入攻击的概念 SQL注入攻击是一种针对数据库驱动的应用程序的攻击技术,其中攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,试图非法访问、操作或破坏后端数据库。当应用程序不正确地处理用户输入,并将其直接拼接到SQ…

C++学习/复习7--泛型编程/函数模板/类模板

一、泛型编程 1.Swap()函数的模板实现 二、函数模板 1.概念 2.格式 3.实例化 (1)隐式与显示 注意事项:隐式与显示类型转换会产生临时变量,临时变量有常性,所以形参前加const 三、类模板 1.定义 2.例1 3.例2 4.注意事…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章!!! 你是否碰到了以下几种问题?先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户,我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

力扣225. 用队列实现栈

Problem: 225. 用队列实现栈 文章目录 题目描述:思路Code 题目描述: 思路 1.对一个queue模拟栈的操作,同时用一个int类型的变量topElem记录每次每次队列队尾的元素(也即是模拟stack中的stack的栈顶元素); 2…

Java Web集成开发环境Eclipse的安装及web项目创建

第一步:下载安装JDK http://t.csdnimg.cn/RzTBXhttp://t.csdnimg.cn/RzTBX 第二步:下载安装Tomcat Tomcat下载安装以及配置_tomcat下载配置-CSDN博客文章浏览阅读2.5k次,点赞2次,收藏13次。Tomcat下载安装及其配置_tomcat下载配…

调整图片和表格尺寸的命令:resizebox

\resizebox 是 LaTeX 中的一个命令&#xff0c;用于调整插入的内容&#xff08;如图像、表格、文本等&#xff09;的大小。它的语法如下&#xff1a; \resizebox{<width>}{<height>}{<content>}其中&#xff1a; <width> 和 <height> 分别表示…

【MATLAB】数字滤波器的设计

一、引言 在信号处理过程中&#xff0c;所处理的信号往往混有噪声&#xff0c;从接收到的信号中消除或减弱噪声是信号传输和处理中十分重要的问题。根据有用信号和噪声的不同特性&#xff0c;提取有用信号的过程称为滤波,实现滤波功能的系统称为滤波器。在以往的模拟电路中用的…

【算法】位运算算法——丢失的数字

题解&#xff1a;丢失的数字(位运算算法) 目录 1.题目2.题解3.位运算异或4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 哈希数组查漏高斯求和排序位运算异或… 3.位运算异或 class Solution { public:int missingNumber(vector<int>& nums) {int ret 0;for…

[Android]项目打包APK时报错PKCS12 keystore not in version 3 format

报错&#xff1a; PKCS12 keystore not in version 3 format Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable > com.android.ide.commo…

Java客户端SpringDataRedis(RedisTemplate)上手

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

AI图书推荐:终极ChatGPT企业手册—借助Python和Java实现

《终极ChatGPT企业手册—借助Python和Java实现》&#xff08;Ultimate ChatGPT Handbook for Enterprises&#xff09;是一本关于ChatGPT的手册&#xff0c;旨在帮助企业利用AI能力、提示工程和ChatGPT的解决方案循环来改变企业景观。这本书提供了深入探讨ChatGPT的演变、能力以…

Linux 实验报告3-4

&#xff08;大家好&#xff0c;今天我们来学习Linux的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 实验三 vi编辑器 一、实验目的 二、实验内容 三、主要实验步骤 实验报告 1.进入 vi。 2.建立一个文件&…

磁盘管理后续——盘符漂移问题解决

之前格式化磁盘安装了文件系统&#xff0c;且对磁盘做了相应的挂载&#xff0c;但是服务器重启后挂载信息可能有问题&#xff0c;或者出现盘符漂移、盘符变化、盘符错乱等故障&#xff0c;具体是dev/sda, sdb, sdc 等等在某些情况下会混乱掉 比如sda变成了sdb或者sdc变成了sdb等…