一、scala介绍
Scala 是 Scalable Language 的简写,是一门多范式的编程语言
scala特性
面对对象特性
Scala是一门面对对向语言,和java一样,scala底层就是java,可以和无缝对接。与java不同的是它是一种纯对象语言,每一个值都是对象。对象的数据类型和行为有类的特质描述。
scala对于抽象类的机制的扩展有两种途径:
- 一种途径是子类继承和java一样
- 另一种途径是灵活的混入机制,避免了多重继承的问题。
函数式编程
Scala是一种函数式语言,函数是可以当作值来使用,甚至可以当作参数传递。支持高阶函数,允许嵌套多层函数
Scala数据类型层次结构
- Any:所有类型的超类(顶级类型)
- AnyVal:表示值类型的超类
- AnyRef:表示引用类型的超类,对应java.lang.Object
- Unit:表示无值,类似Java中的void
- Nothing:所有类型的子类
- Null:表示null或空引用
扩展性
- 任何方法可用作前缀或后缀操作符
- 可以根据预期类型自动构造闭包。
并发性
Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。
二、Scala基础语法
- scala对大小写很敏感,例如:hello和Hello有着不一样的含义
- 类名: 第一个字母要大写
- 方法名称: 所i有的方法名称的第一个字母用小写
def mathodName() - scala注释和java是相同的
- 空行和空格
一行中只有空格或者带有注释,Scala会认为其是空行,编译时直接忽略 - 换行符
- Scala中换行符可以表示一个语句的结束,当然也可以像java一样用分号结束
Scala转义字符
\b | \u0008 | 退格(BS) ,将当前位置移到前一列 |
---|---|---|
\t | \u0009 | 水平制表(HT) (跳到下一个TAB位置) |
\n | \u000a | 换行(LF) ,将当前位置移到下一行开头 |
\f | \u000c | 换页(FF),将当前位置移到下页开头 |
\r | \u000d | 回车(CR) ,将当前位置移到本行开头 |
" | \u0022 | 代表一个双引号(")字符 |
’ | \u0027 | 代表一个单引号(’)字符 |
\ | \u005c | 代表一个反斜线字符 ‘’ |
变量
变量声明
- 首先变量和常量的概念基本和java一样。
常量:在程序运行中值不会改变的量
变量:在程序运行过程中值会放生改变的量。 - 变量的声明方式:
形式一:
var 变量名:变量类型=赋给变量的值
eg: var myVar : String = "bianliang"
形式二:
var 变量名=赋给变量的值
eg: var myVar=12
注释:不写变量类型,scala可以自动识别类型。这就是Scala飘逸所在,入门不知门在哪的原因之一。
当然,如果这么写必须赋初值,否则会报错。
形式三:(多个变量声明)
val xmax, ymax = 666
- 常量的声明方式:
形式一:
val 常量名:变量类型=赋给常量的值
eg: val myVal : String = "bianliang"
形式二:
val 常量名=赋给常量的值
eg: val myVal=12
Scala访问修饰符
私有(Private)成员
用private修饰的成员,只有包含了该成员定义的类或者对象内部可见。
案例演示
class Outer{
class inner{
private def mathod(): Unit ={
println("哈哈哈");
}
class innerSt{
mathod() //正确
}
mathod() //正确
}
mathod() //报错
}
保护(Protected)成员
scala保护乘员属性,与java不同。相比之下安全性更高,比java更加严格。再scala中被protected修饰的成员,只有再定义了该成员的类的子类能够访问的到。
案例演示:
class Father{
protected def fatherMath(): Unit ={println("嘿嘿嘿")}
}
class Son extends Father {
fatherMath()
}
class AdoptedSon{
(new Father).fatherMath()
}
公共(Public)成员
Scala中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。
案例演示:
class Father{
def fatherMath(): Unit ={println("嗯嗯嗯")}
}
class Son extends Father {
fatherMath()
}
class AdoptedSon{
(new Father).fatherMath()
}
作用域保护(private[x]、protected[x])
这里的x指代某个所属的包、类或单例对象。如果写成private[x],读作"这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。
案例演示:
package abc{
package ab{
private[abc] class GrandFather{
protected[ab] def mathod(): Unit ={
println("嘻嘻嘻")
}
}
}
package ac{
import ab._
object Action{
val s=new GrandFather
s.mathod() //报错
}
}
}
循环中与java不一样的部分
for 循环过滤
再scala的for循环中可以用一个或多个if来过滤元素。
案例演示:
for( var x <- List
if condition1; if condition2...
){
statement(s);
for 使用 yield
可以将for循环返回的值作为一个变量存储
案例演示:
var retVal = for{ var x <- List
if condition1; if condition2...
}yield x