scala概述:
Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
- Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。
- Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。
- Scala单作为一门语言来看,非常的简洁高效。
- Scala在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于Java,同时马丁·奥德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中,
因此,对于学习过Java的同学,只要在学习Scala的过程中,搞清楚Scala和Java相同点和不同点,就可以快速的掌握Scala这门语言。
scala开发注意事项:
- Scala源文件以“.scala" 为扩展名。
- Scala程序的执行入口是object 中的main()函数。
- Scala语言严格区分大小写。
- Scala方法由一条条语句构成,每个语句后不需要分号(Scala语言会在每行后自动加分号)。(至简原则)
- 如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。
scala标识符的命名规范
Scala对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可以起名字的地方都叫标识符。
命名规则
Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化,有以下四种规则:
- 以字母或者下划线开头,后接字母、数字、下划线
- 以操作符开头,且只包含操作符(+ - * / # !等)
- 第一种和第二种拼接,第一种在前,二者以下划线分隔
- 用反引号
....
包括的任意字符串,即使是关键字(39个)也可以
scala变量声明
object Demo01Variable {
def main(args: Array[String]): Unit = {
// var | val 变量名 [: 变量类型] = 变量值
// val 声明的是常量,不能被改变,scala是强数据类型语言
// 相当于java里面final修饰的,只有 getter方法,没有setter方法
val name = "laozhang"
// name = "" 不能被改变
// 指定变量类型,如果不指定编译器可以自动推导
val sex:String = "nan"
// var 声明的变量,可以被改变
var age = 18
println("one years later..")
age = 19
//一般建议使用 val,更安全
}
}
scala字符串输出
object Demo02String {
def main(args: Array[String]): Unit = {
val str1 = "abc"
val str2 = "def"
val str3 = str1+str2
println(str3)
//printf用法字符串,通过%传值。字符串用 %s 数值用 %d
printf("字符串是 %s, %d",str3,100)
println()
//字符串,通过 $引用
println(s"字符串是 $str3")
// """ """ 可以放多行字符
val msg1 =
"""
|多
|行
|字
|符
|串
""".stripMargin
val msg2 = """ 多行字符串 """.stripMargin
println(msg1)
}
}
scala键盘输入
import scala.io.StdIn
object Demo03StdIn {
def main(args: Array[String]): Unit = {
// ----------键盘输入
println("请输入姓名:")
val name = StdIn.readLine()
println("请输入密码:")
val pw = StdIn.readInt()
println(s"your name is $name,pw is $pw")
}
}
scala数据类型关系
这是从官网上面截的图哈
1)Scala中一切数据都是对象,都是Any的子类。
2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象。
3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)
4) Scala特殊的类型之Null,它只有一个实例就是Null,它是所有引用类型(AnyRef)的子类。
5)Scala特殊类型之Nothing,是所有数据类型的子类,主要在一个函数没有正常返回值使用,
因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。
object Demo04Type {
def main(args: Array[String]): Unit = {
//Unit 相当于java 的void ,返回为空,它的实例就是 ()
def m1: Unit ={
}
// name1,name1,name1,name1,,name1
val name1 = null
val name2 = ""
println(s"name1 is $name1") // 打印 name1 is null
println(s"name2 is $name2") // 打印 name2 is
if (name1 != null && name1 != "")
println(m1) //输出m1方法的返回值
var i1 = 10
var i2 = 100L
// i1 = i2 long类型赋值给 int 高精度向低精度转换,必须强转(显示转换),可能造成精度丢失
i1 = i2.toInt //long 做一个类型转换
i2.toString
i1+""
true.toString
true+""
i2 = i1 // int类型赋值给 long类型 低精度向高精度转换,自动转换(隐式转换)
// "a2b3c".toInt 必须是纯数字的字符串才可以转换成 Int
println("123".toInt)
println(5/3)
println(5%3)
}
}
scala流程控制
if-else
object Demo05If {
def main(args: Array[String]): Unit = {
val age = 18
/* 单分支 */
if (age == 18){
println("终于成年了")
}
/* 多分支 */
if (age >= 18){
println("go to bar")
}else{
println("go home zhao mama")
}
//如果语句只有一句 可以省略{}
if (age >= 18) println("go to bar")
else println("go home zhao mama")
if (age >= 18)
println("go to bar")
else
println("go home zhao mama")
if (age >= 18){
println("go to bar")
}else if(age >=16){
println("play game 2 hours")
}else{
println("go home zhao mama")
}
val sex ="nan"
/* 嵌套分支 */
if (sex == "nan"){
if (age>=22){
println("you can marry")
}else{
println("wait")
}
}
}
}
for循环控制
object Demo06For {
def main(args: Array[String]): Unit = {
// for( i <- 数组,集合,表达式)
val arr = Array(1,2,3,4)
/* 遍历数组 */
for (i <- arr){
print(i +" ,")
}
println()
println("----------")
val list = List(1,2,3,4)
/* 遍历集合 */
for (i <- list){
print(i +" ,")
}
println()
/* 输出结果包含 10 */
for (i <- 0 to 10){
print(i +" ,")
}
println()
/* 输出结果不包含 10 */
for (i <- 0 until 10){
print(i +" ,")
}
println()
for (i <- "scala"){
if(i != 'a')
print(i +" ,") // 输出 s ,c ,l ,
}
println()
// 打印九九乘法表
for (i <- 1 to(9)){
for (j <- 1 to(i)){
print(s"$j * $i = ${i*j} ")
}
println()
}
}
}
while循环和 do while 循环及 break 和 continue
import scala.util.control.Breaks
object Demo02While {
def main(args: Array[String]): Unit = {
/*
在scala中不能直接使用break和continue
1、需要通过Break.break()直接调用
2、先new一个Breaks对象,再调用break()方法
*/
var num = 10
// 创建Breaks对象
val breaks = new Breaks
// break实例 breakable() 处理异常
breaks.breakable({
while (num > 0){
// 当 num=6 时跳出,结束整个循环
if (num == 6){
// 跳出
breaks.break()
}
print(num + " ") // 10 9 8 7
num -= 1
}
})
println()
// break实例 处理异常
breaks.breakable({
do {
if (num == 1){
// 跳出循环,结束整个循环
breaks.break()
}
print(num + " ") // 6 5 4 3 2
num -= 1
}while(num > 0)
})
println()
println("=============")
var num1 = 10
/* continue实例 */
while (num1 > 0){
breaks.breakable({
// 当 num1 = 6 时 continue,跳过本次循环接着循环下次
if (num1 == 6){
// 跳过
breaks.break()
}
print(num1 + " ") // 10 9 8 7 5 4 3 2 1
})
num1 -= 1
}
}
}