变量和数据类型
注释
和 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的整数类型就是用于存放整数值的,比如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
}
}