写点什么

Scala 基础 (二):变量和数据类型

  • 2022 年 6 月 25 日
  • 本文字数:2999 字

    阅读完需:约 10 分钟

一、变量和常量

如何定义?


  var 变量名 [: 变量类型] = 初始值   val 常量名 [: 常量类型] = 初始值 
复制代码


举个栗子:


    var a: Int = 10;    val b: Int = 22;    // 变量类型可以省略    var a = 10;    val b = 22;
复制代码


由于 Scala 是一个函数式编程语言,所以能用常量的地方不用变量。


重要的结论:


  • 声明变量时,类型可以省略,编译器自动推导,即类型推导。

  • 静态类型,类型经过给定或推导确定后就不能修改。

  • 变量和常量声明时,必须有初始值。

  • var 修饰的变量可变,val 修饰的常量不可变。

  • 引用类型常量,不能改变常量指向的对象,可以改变对象的字段。

  • 不以;作为语句结尾,scala 编译器自动识别语句结尾。

标识符命名的规范

  • 以字母或者下划线开头,后接字母、数字、下划线,和 Java 语法一样

  • Scala 可以使用操作符开头,且只包含操作符(+ - * / # !等)

  • 特别之处:scala 用反引号包括的任意字符串,即使是 Scala 关键字(39 个)也可以。


举个栗子:


    val hello = ""    var Helo = ""    var _abc=123  var -+/% = "hello"  var `if` = 123
复制代码


Scala 中的关键字合集:• package, import, class, object, trait, extends, with, type, forprivate, protected, abstract, sealed, final, implicit, lazy, overridetry, catch, finally, throwif, else, match, case, do, while, for, return, yielddef, val, varthis, supernewtrue, false, null


与 Java 中不同的是:object trait with implicit match yield def val var

字符串

基本的语法


  • 关键字为 String

  • 通过 + 号连接

  • *用于将一个字符串复制多次拼接

  • printf输出字符串,通过 %传值

  • 插值字符串:s"${变量名}“,前缀为 s 格式化模板字符串,f 为格式化模板浮点数,%后面为格式化的内容

  • 原始输出:raw"输出内容${变量名}",输出的结果原样输出

  • 输出语句: print(输出内容)println()printf()

  • 三引号表示字符串,保持多行字符串的原格式输出。"""......."""


举个栗子:


   val name: String = "lisi" + " ";   val age: Int = 12      println(name * 3)   printf("%d岁的%s在吃饭", age, name)      // 格式化模板字符串   println(s"${age}岁的${name}在吃饭")      val num: Double = 2.26054   println(s"this number is ${num}")   println(f"this num is ${num}%2.2f")   println(raw"this num is ${num}%2.2f")      val sql =      s"""         |select *         | from student         | where name = ${name}         | and         | age > ${age}         |""".stripMargin             println(sql)
复制代码

键盘输入

基本语法


  • import scala.io.StdIn,StdIn 在 IO 包下

  • StdIn.readLine() 读取字符串

  • StdIn.readShort()

  • StdIn.readDouble()

  • .....................


举个栗子:


object Test04_StdInt {  def main(args: Array[String]): Unit = {    println("请输入你的名字:")    val name = StdIn.readLine()    println("请输入你的年龄:")    val age = StdIn.readInt()
println(s"欢迎${age}的${name},光临本系统!!!") }}
复制代码


文件输入输出:


import scala.io.Sourceimport java.io.PrintWriterimport java.io.File
object Test05_FileIO { def main(args: Array[String]): Unit = { // 1.从文件中读取数据 Source.fromFile("src/main/resources/test.txt").foreach(print)
// 2。将数据写入文件 val writer = new PrintWriter(new File("src/main/resources/put.txt")) writer.write("hello scala from java") writer.close() }}
复制代码

二、数据类型

Java 中的数据类型


  • 基本类型:char、byte、short、int、long、float、double、boolean

  • 对应的包装类:Character、Byte、Short、Integer、Long、Float、Double、Boolean

  • 由于 Java 有基本类型,而且基本类型不是真正意义的对象,Java 不是纯粹的面向对象。


Scala 中的数据类型


  • Scala 中一切数据都是对象,Any是所有数据的父类。

  • Any对应有两个子类,一个是数值类型(AnyVal),另一个是引用类型(AnyRef

  • StringOps是对 Java 中的String增强。

  • Unit为 Scala 中的一个数据类型,对应 Java 中的void,表示方法没有返回值,只有一个单例对象,输出为符串(),而void是一个关键字

  • Scala 中默认为低精度数据类型转为高精度数据类型(自动转换 \ 隐式转换)

  • Null是一个类型,只 有一个对 象就 是null。它是所有引用类型(AnyRef)的子类。

  • Nothing,是所有数据类型的子类,在一个函数没有明确返回值时使用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。<center>数据类型图(来源于网络~)</center>


整数类型

  • Byte [1 个字节] 8 位有符号补码整数。数值区间为 -128127

  • Short [2 个字节] 16 位有符号补码整数。数值区间为 -3276832767

  • Int [4 个字节] 32 位有符号补码整数。数值区间为 -21474836482147483647

  • Long [8 个字节 ] 64 位有符号补码整数。数值区间为 -92233720368547758089223372036854775807= 2 的(64-1)次方-1

  • 各整数类型有固定的表示范围和字段长度

  • Scala 默认的数据类型为Int,长整型需要加 l 或者 L

  • 高精度数转低精度数需要强制类型转换: val b3: Byte = (1 + 10).toByte


举个栗子:


    val al: Byte = 127    val a2: Byte = -128
val a3 = 12
val b1: Byte = 10 val b2: Byte = (10 + 20) println(b2)
val b3: Byte = (b1 + 10).toByte
复制代码

浮点类型

  • Float [4] 32 位, IEEE 754 标准的单精度浮点数

  • Double [8] 64 位 IEEE 754 标准的双精度浮点数

  • 默认为Double类型


举个栗子:


    val f1: Float = 1.232f    val d2 = 12.987
复制代码

字符类型

  • 字符类型是 Char,表示单个字符

  • 字符常量是用单引号 ' ' 括起来的单个字符。

  • 转义字符:\t 、\n、\\、\”

布尔类型

  • Booolean 类型数据只允许取值 truefalse

  • 占一个字节


举个栗子:


    val isTrue = true    val isFalse: Boolean = false    println(isTrue)
复制代码

空类型

  • Unit :表示无值 只有一个实例值,写成()

  • Null : Null 类型只有一个实例值 null

  • Nothing : 确定没有正常的返回值,可以用 Nothing 来指定返回类型


举个栗子:


    def m2(n: Int): Int = {      if (n == 0)        throw new NullPointerException      else        return n    }
复制代码

类型转换

  • 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。

  • 高精度数据转嘀精度时会报错。

  • ByteShortChar 之间不会相互自动转换。

  • ByteShortChar 他们三者可以计算,在计算时首先转换为 Int 类型。


举个栗子:


    val a1: Byte = 10;    val b1: Long = 20L;    val result1: Long = a1 + b1    println(result1)
复制代码

强制类型转换

  • 强制类型转换:toBytetoInt、......

  • 'aaa'.toInt 2.2.toInt

  • 存在精度丢失

  • 数值和 String 之间的转换:基本类型的值+" "s1.toInt、s1.toFloat、s1.toDouble、s1.toByte


举个栗子:


   val n1: Int = 2.5.toInt    println(n1)
val n2: Int = (2.6 + 3.7).toInt println(n2)
复制代码


    // 数值转为String    val a: Int = 27    val s: String = a + " "    println(s)
//String转换为数值 val m: Int = "12".toInt val f: Float = "12.4".toFloat val f2: Int = "12.6".toFloat.toInt println(f2)
复制代码


本次文章分享到这里就结束了,希望对你有所帮助!!!


发布于: 刚刚阅读数: 3
用户头像

该来的总会来,或迟或早。🎈 2022.06.13 加入

有JAVA方面3年学习经验,csdn/51cto等平台优质作者,华为云云享专家、阿里云受邀专家博主,擅长JAVA,大数据等方面的技术等。

评论

发布
暂无评论
Scala 基础 (二):变量和数据类型_scala_百思不得小赵_InfoQ写作社区