变量和常量
var 变量名:[变量类型] = 变量值
val 变量名:[变量类型] = 变量值
- 尽量使用常量
- 声明一个变量,类型可以省略,编译器自动推断
- 类型确定以后不能改变
- 变量声明时必须要有初值
- var可修改,val不可修改
val alice = new Student("Alice",23)
alice.age = 24 // 常量指向的对象不可更改,但其中的属性如果是var,就可以更改
class Student(name: String, var age: Int) {}
关键字
- 以字母或者下划线开头,后接字母、数字、下划线
- 以操作符开头,且只包含操作符 + - * /……
- 以反引号
...
包含的任意字符串var +-*/ = "sdsda"
var `if` = "sdasdjo"
字符串
```scala // 字符串通过 + 连接 val name String = “alice” val age: Int = 18 println(age + “岁的” + name + “在学习”)
// 用于字符串复制多次拼接 println(name 3)
// printf用法,字符串通过%传值 printf(“%d岁的%s在学习/n”, age, name)
//字符串模板(插值字符串):通过$获取变量值 println(s”${age}岁的${name}在学习”)
val num: Double = 2.3456 println(f”The num is ${num}%3.2f”) // 格式化模板字符串 3:整个数的长度至少为3,不够补空格 // 2:只保留两位小数
println(raw”The num is ${num}%2.2f”)//不解析2.2f
//三引号表示字符串,保持多行字符串原格式输出、 val sql = s””” |select * |from | student |where | name = ${name} |and | age > ${age} |”””.stripMargin println(sql)
<a name="wLZ7A"></a>
## 标准控制台输入
```scala
import scala.io.StdIn
object Test {
def main(args: Array[String]): Unit = {
println("请输入名字:")
val name: String = StdIn.readLine()
println("请输入年龄")
val age: int = StdIn.readInt()
//控制台输出
println(s"欢迎${age}岁的${name}来学习")
}
}
读写文件
import scala.io.Source
object Test {
def main(args: Array[String]): Unit = {
//从文件读数据并打印
Source.fromFile("src/main/test.txt").foreach(print)
//将数据写入文件
val writer = new PrintWriter(new File("src/main/output.txt"))
writer.write("hello")
writer.close()
}
}
数据类型
由于Java有基本类型,所以不是完全面向对象的语言
- Scala中一切数据都是对象,都是Any的子类
- Scala中数据类型分为两大类:数值类型(AnyVal)引用类型(AnyRef),不管是值类型还是引用类型都是对象
- Scala数据类型仍然遵守:低精度的值类型向高精度值类型转换
- Scala中StringOps是对Java中String增强
- Unit对应Java中的void。Unit是一个数据类型,只有一个对象就是0。Void不是数据类型只是关键字
- Null是一个类型,只有一个对象是null。是所有引用类型AnyRef的子类
- Nothing是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样我们可以把输出的返回值,返回给任何的变量或者函数
val b: Int = null // error, null 是引用类型的子类
整数类型 (Byte Short Int Long)
Byte [1]: 8位有符号补码整数。数值区间为 -128 ~ 127
Short[2]:16位有符号补码。区间 -32767 ~ 32767
Int[4]:32位有符号补码整数。数值区间 -2147483648 ~ 2147483647
long[8]:64位有符号补码 ```scala val b1: Byte = 10 val b2: Byte = (10 + 20) val b3: Byte = (b1 + 20)//error val b4: Byte = (b1 + 20).toByte
// 浮点类型 val f1: Float = 1.234f val d1: = 24.232
// 字符类型 val c1: Char = ‘a’ val c2: Char = ‘9’ val c3: Char = ‘\t’ // 制表符 val c4: Char = ‘\n’ // 换行符
// 字符变量底层保存ASCII码 val i1: Int =c1 println(“i1:” + i1) //97 val i2: Int = c2 // 57
val c7: Char = (i1+1).toChar println(c7)//b val c8: Char = (i2 - 1).toChar println(c8) //8
<a name="1mNw8"></a>
### Unit类型、Null类型和Nothing类型
| 数据类型 | 描述 |
| --- | --- |
| Unit | 表示无值,和void等同。用作不返回任何结果的方法的类型。Unit只有一个实例:0 |
| Null | Null类型只有一个实例值null |
| Nothing | Nothing类型再Scala类型最底层,它是任何类型的子类型<br />当一个函数,我们确定没有正常的返回值,可以用Nothing来指定返回类型,这样的好处是我们可以把返回的值(异常)赋给其它的函数或者变量 |
```scala
// 空类型Unit
def m1(): Unit = {
println("m1被调用执行")
}
val a: Unit = m1()
println("a:" + a)
//结果:
m1被调用执行
a:()
// 空引用Null
val n: Int = null //error
var student = new Student("Alice",20)
student = null
println(student)// null
// Nothing
def m2(n: Int): Int = {
if (n==0)
throw new NullPointerException // 返回值为Nothing
else
return n // 返回值为Int,为Nothing的父类
}
val b = m2(2)
println(b)//2
类型转换
object Test {
def main(args: Array[String]): Unit = {
//自动提升原则
val a1: Byte = 10
val b1: Long = 2333
val result1: Long = a1 + b1
val result2: Int = (a1 + b1.toInt) //强转
// 精度大的值赋给精度小的,就会报错,反之就会进行自动类型转换
val a2: Byte = 10
val b2: Int = a2
val c2: Byte = b2//error
// byte short 和char之间不会相互自动转换
val a3: Byte = 10
val b3: Char = 'b'
val c3: Byte = b3 // error
//byte short char 三者计算,首先转换为int类型
val a4: Byte = 12
val b4: Short = 25
val c4: Char = 'c'
val result4: Int = a4 + b4 + c4 //136
}
}
强制类型转换
Java:int num = (int)2.5
Scala: var num: Int = 2.7.toInt
val n1: Int = -2.9.toInt
println("n1:" + n1) //-2
val n2: Int = 2.6.toInt + 3.7.toInt
val n3: Int = (2.6 + 3.7).toInt
println(n2)//5
println(n3)//6
//Strint 类型转换
//数值转String
val n: Int = 27
val s: String = n + ""
val s2: String = n.toString
// String转数值
val m: Int = "12".toInt
val f: Float = "12.3".toFloat
val f2: Int = "12.3".toDouble.toInt
// String转Char
val 变量名: 值类型 = 字符串.toCharArray