提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 变量和数据类型
-
- 1.注释
- [2 变量和常量(重点)](#2 变量和常量(重点))
- [3 标识符的命名规范](#3 标识符的命名规范)
- [4 字符串输出](#4 字符串输出)
- [5.IO 输入 输出](#5.IO 输入 输出)
-
- 键盘输入
- [读写文件 IO](#读写文件 IO)
- 6.数据类型(重点)
- [7 整数类型(Byte、Short、Int、Long)](#7 整数类型(Byte、Short、Int、Long))
- [8 浮点类型(Float、Double)](#8 浮点类型(Float、Double))
- [9 字符类型(Char)](#9 字符类型(Char))
- [10 布尔类型:Boolean](#10 布尔类型:Boolean)
- [11 Unit 类型、Null 类型和 Nothing 类型(重点)](#11 Unit 类型、Null 类型和 Nothing 类型(重点))
-
- [Unit 类型](#Unit 类型)
- [Null 类](#Null 类)
- [Nothing 类型](#Nothing 类型)
- 类型转换
-
- [1 数值类型自动转换](#1 数值类型自动转换)
- [2 强制类型转换](#2 强制类型转换)
- [3 数值类型和 String 类型间转换](#3 数值类型和 String 类型间转换)
变量和数据类型
1.注释
Scala 注释使用和 Java 完全一样。
- 注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。
scala
package com.atguigu.chapter02
object TestNotes {
def main(args: Array[String]): Unit = {
//(1)单行注释://
println("dalang")
//(2)多行注释:/* */
/*
println("dalang")
println("jinlian")
*/
//(3)文档注释:/**
//*
//*/
/**
* println("qingge")
println("qingge")
println("qingge")
*/
}
}
2) 代码规范
(1)使用一次 tab 操作,实现缩进,默认整体向右边移动,用 shift+tab 整体向左移
(2)或者使用 ctrl + alt + L 来进行格式化
(3)运算符两边习惯性各加一个空格。比如:2 + 4 * 5。
(4)一行最长不超过 80 个字符,超过的请使用换行展示,尽量保持格式优雅
2 变量和常量(重点)
常量:在程序执行的过程中,其值不会被改变的变量
2)案例实操
- 声明变量时,类型可以省略,编译器自动推导,即类型推导
- 类型确定后,就不能修改,说明 Scala 是强数据类型语言。
- 变量声明时,必须要有初始值
- 在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,val 修饰的变量不可改。
- var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值)
却是可以改变的。(比如:自定义对象、数组、集合等等)
scala
package chapter02
import chapter01.Student
object Test02_Variable {
def main(args: Array[String]): Unit = {
// 声明一个变量的通用语法
var a: Int = 10
//(1)声明变量时,类型可以省略,编译器自动推导,即类型推导
var a1 = 10
val b1 = 23
//(2)类型确定后,就不能修改,说明Scala是强数据类型语言。
var a2 = 15 // a2类型为Int
// a2 = "hello"
//(3)变量声明时,必须要有初始值
// var a3: Int
//(4)在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。
a1 = 12
// b1 = 25
var alice = new Student("alice", 20)
alice = new Student("Alice", 20)
alice = null
val bob = new Student("bob", 23)
bob.age = 24
bob.printInfo()
// bob = new Student("bob", 24)
}
}
3 标识符的命名规范
Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可以起名字的地方都叫标识符。
1)命名规则
Scala 中的标识符声明,基本和 Java 是一致的,但是细节上会有所变化,有以下三种规则:
scala
object Test03_Identifier {
def main(args: Array[String]): Unit = {
//(1)以字母或者下划线开头,后接字母、数字、下划线
val hello: String = ""
var Hello123 = ""
val _abc = 123
// val h-b = ""
// val 123abc = 234
//(2)以操作符开头,且只包含操作符(+ - * / # !等)
val -+/% = "hello"
println(-+/%)
//(3)用反引号`....`包括的任意字符串,即使是Scala关键字(39个)也可以
val `if` = "if"
println(`if`)
}
}
4 字符串输出
1)基本语法
(1)字符串,通过+号连接
(2)printf 用法:字符串,通过%传值。
(3)字符串模板(插值字符串):通过$获取变量值
scala
package chapter02
object Test04_String {
def main(args: Array[String]): Unit = {
//(1)字符串,通过+号连接
val name: String = "alice"
val age: Int = 18
println(age + "岁的" + name + "在尚硅谷学习")
// *用于将一个字符串复制多次并拼接
println(name * 3)
//(2)printf用法:字符串,通过%传值。
printf("%d岁的%s在尚硅谷学习", age, name)
println()
//(3)字符串模板(插值字符串):通过$获取变量值
println(s"${age}岁的${name}在尚硅谷学习")
val num: Double = 2.3456
println(f"The num is ${num}%2.2f") // 格式化模板字符串
println(raw"The num is ${num}%2.2f")
// 三引号表示字符串,保持多行字符串的原格式输出
val sql = s"""
|select *
|from
| student
|where
| name = ${name}
|and
| age > ${age}
|""".stripMargin
println(sql)
}
}
5.IO 输入 输出
键盘输入
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
1)基本语法
- StdIn.readLine()
- StdIn.readShort()
- StdIn.readDouble()
scala
package chapter02
import scala.io.StdIn
object Test05_StdIn {
def main(args: Array[String]): Unit = {
// 输入信息
println("请输入您的大名:")
val name: String = StdIn.readLine()
println("请输入您的芳龄:")
val age: Int = StdIn.readInt()
// 控制台打印输出
println(s"欢迎${age}岁的${name}来到尚硅谷学习")
}
}
读写文件 IO
- 从文件中读取数据
scala
object Test06_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/output.txt"))
writer.write("hello scala from java writer")
writer.close()
}
}
- 将数据写入文件 (引入java的io流)
scala
import java.io.{File, PrintWriter}
import scala.io.Source
object Test06_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/output.txt"))
writer.write("hello scala from java writer")
writer.close()
}
}
6.数据类型(重点)
回顾:Java数据类型
Scala数据类型
7 整数类型(Byte、Short、Int、Long)
Scala 的整数类型就是用于存放整数值的,比如 12,30,3456 等等
1)整型分类
2)案例实操
- Scala 各整数类型有固定的表示范围和字段长度,不受具体操作的影响,以保证Scala 程序的可移植性
- Scala 的整型,默认为 Int 型,声明 Long 型,须后加'l'或'L'
- Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long
scala
import chapter01.Student
object Test07_DataType {
def main(args: Array[String]): Unit = {
// 1. 整数类型
val a1: Byte = 127
val a2: Byte = -128
// val a2: Byte = 128 // error
val a3 = 12 // 整数默认类型为Int
val a4: Long = 1324135436436L // 长整型数值定义
val b1: Byte = 10
val b2: Byte = 10 + 20
println(b2)
// val b3: Byte = b1 + 20
val b3: Byte = (b1 + 20).toByte
println(b3)
}
}
8 浮点类型(Float、Double)
Scala 的浮点类型可以表示一个小数,比如 123.4f,7.8,0.12 等等
scala
object Test01 {
def main(args: Array[String]): Unit = {
// 建议,在开发中需要高精度小数时,请选择 Double
var n7 = 2.2345678912f
var n8 = 2.2345678912
println("n7=" + n7)
println("n8=" + n8)
}
}
9 字符类型(Char)
1)基本说明
字符类型可以表示单个字符,字符类型是 Char。
2)案例实操
(1)字符常量是用单引号 ' ' 括起来的单个字符。
(2)\t :一个制表位,实现对齐的功能
(3)\n :换行符
(4)\ :表示 \
(5)" :表示"
scala
object Test01 {
def main(args: Array[String]): Unit = {
//(1)字符常量是用单引号 ' ' 括起来的单个字符。
var c1: Char = 'a'
println("c1=" + c1)
//注意:这里涉及自动类型提升,其实编译器可以自定判断是否超出范围,
//不过 idea 提示报错
var c2:Char = 'a' + 1
println(c2)
//(2)\t :一个制表位,实现对齐的功能
println("姓名\t 年龄")
//(3)\n :换行符
println("西门庆\n 潘金莲")
//(4)\\ :表示\
println("c:\\岛国\\avi")
//(5)\" :表示"
println("同学们都说:\"大海哥最帅\"")
}
}
10 布尔类型:Boolean
1)基本说明
(1)布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
(2)boolean 类型占 1 个字节。
scala
object Test01 {
def main(args: Array[String]): Unit = {
var isResult: Boolean = false
var isResult2: Boolean = true
println(isResult)
println(isResult2)
}
}
11 Unit 类型、Null 类型和 Nothing 类型(重点)
1)基本说明
Unit 类型
- Unit 类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit 类似于 Java 里的 void。Unit 只有一个实例------( ),这个实例也没有实质意义
scala
object Test01 {
def main(args: Array[String]): Unit = {
def sayOk: Unit = { // unit 表示没有返回值,即 void
println("sayOk 被调用执行")
}
println(sayOk)
}
}
Null 类
- Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。
- Null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
scala
object Test01 {
def main(args: Array[String]): Unit = {
//null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型 (AnyVal)
var cat = new Cat();
cat = null // 正确
println("cat:" + cat)
}
}
class Cat {
}
Null 不能赋值给值类型(AnyVal)
Nothing 类型
- Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方 法不会正常返回
- 而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容
Nothing 应用场景
scala
object Test01 {
def main(args: Array[String]): Unit = {
def m1(n: Int): Int = {
if (n == 0)
throw new NullPointerException
else
return n
}
println(m1(5))
println(m1(-2))
println(m1(0))
}
}
类型转换
1 数值类型自动转换
- 当 Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
- 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
- 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
- (byte,short)和 char 之间不会相互自动转换。
- byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
scala
object Test01 {
def main(args: Array[String]): Unit = {
// 1. 自动类型转换
// (1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
val a1: Byte = 10
val b1: Long = 2353
val result1: Long = a1 + b1
val result11: Int = (a1 + b1.toInt) // 强转
// (2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
val a2: Byte = 10
val b2: Int = a2
// val c2: Byte = b2 // error
// (3)(byte,short)和char之间不会相互自动转换。
val a3: Byte = 10
val b3: Char = 'b'
// val c3: Byte = b3 // error
val c3: Int = b3
println(c3)
// (4)byte,short,char他们三者可以计算,在计算时首先转换为int类型。
val a4: Byte = 12
val b4: Short = 25
val c4: Char = 'c'
val result4: Int = a4 + b4
val result44: Int = a4 + b4 + c4
println(result44)
}
}
2 强制类型转换
1)基本说明
自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意
2)案例实操
- 将数据由高精度转换为低精度,就需要使用到强制转换
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
3 数值类型和 String 类型间转换
1)基本说明
- 在程序开发中,我们经常需要将基本数值类型转成 String 类型。或者将 String 类型转成基本数值类型。
2)案例实操
- 基本类型转 String 类型(语法:将基本类型的值+"" 即可)
- String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)
注意事项
在将 String 类型转成基本数值类型时,要确保 String 类型能够转成有效的数据,
- 比如我们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。