Scala变量和数据类型

变量和数据类型

注释

和 Java 中的注释一模一样,这里不做过多赘述。

// 单行注释

/*
  多行注释
*/

/*
 * 文档注释
 */

变量和常量

常量:在程序执行的过程中,其中不会被改变的变量

// 变量
// var 变量名 [: 变量类型] = 初始值
var i:Int = 20
// 常量
// val 变量名 [: 变量类型] = 初始值
val j:Int = 10

能用常量的地方不用变量

标识符的命名规范

Scala对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可以起名字的地方都叫标识符。

命名规则

Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化,有一下三种规则:

  • 以字母或者下划线开头,后接字母、数字、下划线
  • 以操作符开头,且只包含操作符
  • 用反引号包括的任意字符串,即使是Scala关键字也可以

字符串输出

  • 通过+连接
  • printf用法:字符串,通过%传值
  • 字符串模板(插值字符串):通过$获取变量值
object Test04_String {

  def main(args: Array[String]): Unit = {
    val name:String = "zihoo"
    val age:Int = 21

    // 通过+连接
    println(age + "岁的" + name + "学习scala")

    // * 用于字符串复制多次进行拼接
    println(name * 3)

    // printf用法:字符串,通过%传值
    printf("%d岁的%s学习scala\n", age, name)

    // 字符串模板(插值字符串):通过$获取变量值
    println(s"${age}岁的${name}学习scala")

    // 格式化模板字符串
    val num:Double = 3.1415926
    println(f"The number is ${num}%1.2f")

    // 三引号表示字符串,保持多行字符串的原格式输出
    val sql =
      s"""
         |select *
         |from
         |  student
         |where
         |  name = ${name} and age = ${age}
         |""".stripMargin
    println(sql)
  }
}

键盘输入

在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。

import scala.io.StdIn

object Test05_StdIn {

  def main(args: Array[String]): Unit = {
    // 输入信息
    print("请输入您的名字:")
    val name:String = StdIn.readLine()

    print("请输入您的年龄:")
    val age:Int = StdIn.readInt()

    print(s"欢迎${age}岁的${name}学习scala")
  }

}

读写文件

Scala中没有封装写文件的方法。但是在之前我们已经了解到,Scala中可以直接写Java的方法,所以我们可以使用Java的方法来进行写文件。

import java.io.{File, PrintWriter}
import scala.io.Source

object Test06_FileIO {
  def main(args: Array[String]): Unit = {
    // 从文件中读取数据
    Source.fromFile("src/main/resources/test.txt").foreach(print)

    // 将数据写入文件
    val writer = new PrintWriter(new File("src/main/resources/output.txt"))
    writer.write("Hello Scala from Java")
    writer.close()
  }
}

数据类型

Scala中一切数据都是对象,都是Any的子类

Scala中数据类型分为两大类:数值类型、引用类型,不管是值类型还是引用类型都是对象

Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换

Scala中的StringOps是对Java中的String增强

Unit对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是()。Void不是数据类型,只是一个关键字。

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

Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样我们可以把抛出的返回值,返回给任何变量或者函数。

 scala hierarchy

整数类型

Scala的整数类型就是用于存放整数值的,比如12, 30, 3456等等

数据类型 长度 描述
Byte 1 8位有符号补码整数。数值区间为-128 - 127
Short 2 16位有符号补码整数。数值区间为-32768 - 32767
Int 4 32位有符号补码整数。数值区间为-2147483648 - 2147483647
Long 8 64位有符号补码整数。数值区间为-9223372036854775808 - 9223372036854775807

字符类型

可以表示单个字符,字符类型是char

空类型

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

类型转换

类型自动转换

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

把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换

(byte, short)和char之间不会相互自动转换

byte, short, char它们三者可以计算,在计算时首先转换为int类型

package chapter02

object Test08_DataTypeConversion {

  def main(args: Array[String]): Unit = {
    // 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型
    val a1: Byte = 10
    val b1: Long = 2200
    val result: Long = a1 + b1
    var resultInt: Int = (a1 + b1.toInt)

    // 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换
    val a2: Byte = 10
    val b2: Int = a2
    var c2: Byte = b2.toByte

    // (byte, short)和char之间不会相互自动转换
    val a3: Byte = 10
    val b3: Char = 'b'
    // val c3: Byte = b3  // error

    // byte, short, char它们三者可以计算,在计算时首先转换为int类型
    val a4: Byte = 10
    val b4: Short = 203
    val c4: Char = 'b'
    val result4: Int = a4 + b4

  }
}

除此之外,Scala还提供了非常强大的隐式转换机制(隐式函数,隐式类等)。

强制类型转换

自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。

object Test08_DataTypeConversion {

  def main(args: Array[String]): Unit = {
    // 强制类型转换
    // 将高精度转换为低精度
    val n1: Int = 2.5.toInt
    println(s"n1: ${n1}")
    val n2: Int = -2.7.toInt
    println(s"n2: ${n2}")

    // 强转符号只针对最近的操作符有效,往往会使用小括号来提升优先级
    val n3: Int = 2.3.toInt + 3.7.toInt
    val n4: Int = (2.3 + 3.7).toInt

    // 数值类型和String类型的转换
    // 数值-->String
    val number: Int = 27
    val str: String = number + ""
    println(str)

    // String --> number
    val number2: Int= "12".toInt
  }
}
posted @ 2022-01-01 20:25  Gazikel  阅读(43)  评论(0编辑  收藏  举报