详解 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 = 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
        
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师【第1章】: 绪论 (核心总结)

文章目录 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来 1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.2.3 架构设计师的知识…

自适应星空背景个人导航单页(附带源码)

自适应星空背景个人导航单页 效果图部分源码领取源码下期更新预报 效果图 部分源码 function Star(id, x, y) {this.id id;this.x x;this.y y;this.r Math.floor(Math.random() * 2) 1;var alpha (Math.floor(Math.random() * 10) 1) / 10 / 2;this.color "rgba(…

pip install pytorch-quantization error

一 报错信息 最近安装pytorch-quantization报错,安装失败报错信息如下: Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

Kali : 安装Google Chrome 浏览器和ChromeDriver

一、安装Google Chrome 浏览器 1、下载Google Chrome 执行如下命令,下载最新版Chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 执行下载截图 2、安装Chrome 使用dpkg安装下载的deb包 sudo dpkg -i google-chrome-st…

美业系统SaaS收银系统源码-顾客在系统付款了但系统未显示怎么办?美业系统实测

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 提供门店名称、付款凭证和会员手机号 2. 到订单明细查询, 按门店名称和会员手机号查询看是否有相…

IDEA社区版创建并运行maven管理的web项目的基本流程

一、前言 注意,这是社区版,旗舰版可以绕路。 二、过程 1、下载安装社区版 2、安装jdk,tomcat,maven 3、创建并启动项目 注意选择的骨架是maven-archetype-webapp,然后next,设置项目名,存放…

家政预约小程序07服务分类展示

目录 1 创建服务分类页面2 侧边栏选项卡配置3 配置数据列表4 从首页跳转到分类页总结 上一篇我们开发了首页的服务展示功能,本篇我们讲解一下服务分类功能的开发。在小程序中通常在底部导航栏有一个菜单可以展示所有服务,侧边选项卡可以展示分类信息&…

Android 11 触摸小圆点显示流程

在开发者选项中,打开 “显示点按操作反馈” 开关,当我们在触摸屏幕时,会显示一个小圆点,来分析下小圆点的显示流程。 操作这个开关时,其实就是操作Settings数据库中的 SHOW_TOUCHES //packages\apps\Settings\src\com…

数据大屏vue3+ts+axios+MockJS+dataV+echarts

一、官网/文档 vue3:https://cn.vuejs.org/api/TypeScript:https://www.tslang.cn/docs/handbook/basic-types.htmlaxios:http://www.axios-js.com/zh-cn/docs/MockJS:http://mockjs.com/dataV:http://datav.jiamingh…

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天,埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资,主要用于打造一台巨大的超级计算机,马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI,技术和算力的发展历经了几个时代,但似乎马斯克的吸金能力一直…

CISCN --EzHeap

当时有点着急了,这题没写出来,结束后在ctfshow上做了一下。 使用的方法是environ泄露栈地址,然后在栈上构造orw的rop链。 以下是过程: 只能orw。 堆体开沙盒模式会在heap和bin一开始构造很多垃圾堆。所以分配和free的时候要注意…

nuxt3+Element Plus项目搭建过程记录

背景 本文只记录项目搭建过程中遇到的一些问题和关键点&#xff0c;nuxt框架的说明和API请参照官网学习 官网&#xff1a;https://nuxt.com/docs/getting-started/introduction 1. 初始化项目 指令如下: npx nuxilatest init <project-name>我在安装过程中出现报错&a…

玻璃加工生产线液压比例控制器

玻璃加工生产线广泛应用于自动化中空玻璃的生产、清洗、磨边、上片、除膜、打胶等各个环节&#xff0c;体现了高度的专业化和自动化水平。在玻璃制造过程中&#xff0c;液压升降机用于玻璃板材的升降和定位&#xff0c;确保玻璃在加工过程中的稳定性。液压系统提供的强大而平稳…

2024-05-28 服务器开发-不同vs版本的std::string的访问出错问题-记录

摘要: 有一个dll库是使用vs2010编译的, 使用这个dll动态库的工程是vs2019. 这个dll动态库返回一个结构体&#xff0c;其中有个成员使用了std::string。但是遇到了std::string的成员显示被赋值为NULL的情况。 本文对进行分析, 重点在于追踪问题的思路。 问题描述: dll使用vs20…

盐城市大数据集团携手百望云 以MaaS推进数字经济跃迁

随着ChatGPT的爆火&#xff0c;大模型、人工智能、大数据等技术&#xff0c;被快速推向市场最前沿。如何通过创新技术提升企业的数字化能力&#xff0c;助力数据要素资产沉淀&#xff0c;推动企业及所在行业、区域实现数智化转型&#xff0c;是大家关注的核心问题。 “携手共建…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

ChatGPT原创指令大全(持续更新)

随着ChatGPT在互联网上的使用越来越多&#xff0c;但很多人在使用ChatGPT的过程中会觉得得到的答案并不是很精准。究其原因其实是你给它的命令不够准确、不够到位。实际现在网上已经很多关于ChatGPT的网站&#xff0c;可以快速生成带有快捷键的ChatGPT指令。但是对于不熟悉Chat…

C++学习/复习8--STL简介/六大组件/缺陷

一、STL简介 二、六大组件 三、面试题 四、STL缺陷

前端使用JavaScript实现一个LRU缓存

引言 LRU&#xff08;Least Recently Used&#xff09;算法是一种广泛应用于内存管理和缓存系统的策略&#xff0c;在微前端、状态管理以及性能优化等场景下&#xff0c;合理使用缓存机制能够有效提升应用性能。本文将介绍LRU算法的基本原理&#xff0c;并通过JavaScript实现案…

Debian12 安装留档@Virtual Box

在学蜜罐系统的时候&#xff0c;T-Pot 需要Debian&#xff0c;于是安装Debian12 下载安装光盘 先去中科大下载了12的安装光盘&#xff0c;然后在VirtualBox中创建一个新虚拟机&#xff0c;将安装光盘挂载上。 安装光盘下载地址&#xff1a;https://mirrors.ustc.edu.cn/debi…