选用的Scala版本:2.11.8
一、申明值和变量
定义的规范“val name : String = null”,val 表示这个变量是常量,内容无法改变;你也可以使用var 标注变量为可变内容。
常用的数据类型:
数据类型 | 含义 |
---|---|
Int | 整型 |
Long | 长整型 |
Float | 浮点 |
Double | 双精度浮点 |
String | 字符串 |
Boolean | 布尔值 |
数值之间的转换:
类型转换
Int -> Double
10.asInstanceOf[Double]
判断是否是某个类型
10.isInstanceOf[Int]
二、函数
Scala是结合面向对象编程和面向函数式编程的语言。Scala函数的定义“def 函数名(参数名:类型,参数名:类型): 返回值类型 = {}”,这个返回值可以有,可以没有。当没有返回值得时候,可以用Unit,这表示Java中的void;也可以省去“: 返回值类型 =”,这个时候要注意,这个没有参数也会更具最后一行的执行结果返回参数。所以虽好协商Unit。
函数定义:
def main(args: Array[String]): Unit = {
}
Scala的函数中最后一行的代码默认作为整个函数的返回值。
def judge(a:Int){
if(a > 100){
true
} else {
false
}
}
函数怎么调用:
如果有参数
app(a, b)
如果没有参数,可以不写(),除带有默认参数外
app
2.1 命名参数
如果一个函数有几个参数,你在调用的时候可以指定参数的值。
def teacher(name:String, sex:String): Unit ={
println(name)
println(sex)
}
调用的时候可以使用“teacher(“hehehe”,”man”)”,命名参数调用是“teacher(name = “hahaha”,sex = “weman”)”
2.2 可变参数
当同一类型的参数输入的时候不知道多少个数量,可以使用可变参数。
def sum(nums:Int*): Int ={
var result:Int = 0;
for(num <- nums){
result += num
}
result
}
调用:sum(1,2,3,4,5) 或者 sum(1 to 5 :_*) 或者 sum(Array(1,2,3,4,5) :_*)
三、Range
数组中常常需要导入数据,使用一定规律、一定范围数据,比如1到10,200 到300的整数等等。创建的方式:to,until,Range。
to: []
1 to 10 或者 1.to(10)
Until: [)
1.untile(10) 或者 1 untile 10
Range:[) 可以包含步长
Range(1,10) 或者 Range(1,10,1)
四、循环
循环包含for、while等。
for
for(i <- 1 to 10){}
for(i <- 1 to 10 if i % 2 == 0){} \\i等于偶数执行
while
while(true){}
do..while
do....while(true)
五、面向对象编程
面向对象编程,也是Scala的特性。
5.1 简单类定义
class People{
var name:String = ""
var age:Int = 10
private[this] val gender = "M"
def eat()={
name + " eat....."
}
}
如何使用:val people : People = new People(),凡是对象都是需要new一个出来,剩下的操作就像是Java一样。思考一个问题:如果var name换成val name会怎样?当然编译不通过,因为会重复赋值val对象。再思考一个问题,如果一开始在类中没有名字和年龄,就不要给他赋值,那怎么办呢,使用占位符“_”,String默认是null,数值型默认是0。
People中的属性gender是一个private[this],表示对象私有成员,外界无法访问。很有意思的是这个this,这个表示这个private只能在本对象可见,如果把this 换成 该包名,就表示该包内可见。
5.2 构造函数
Java中也有构造函数,就是在生成一个对象的时候,按照要求不同,调用不同的构造方法,实现代码复用性。
class Girl(val name:String, val age:Int){
println("Girl enter")
println("Girl exit")
}
调用:val girl = new Girl(“Cindy”, 19)。
输出:Girl enter换行Girl exit
总结:这种构造叫做主动构造,构造中的参数以及类中属性都被当做对象的属性来使用。当对象被创建的时候先执行执行语句,如“println(“Girl enter”)”。还有一个有趣的事情,如果主动构造中的 var/val 不写,就会把这个属性当做private[this]。
附属构造函数(相当于构造器的重载),定义
var phone:String=_
def this(name:String, age:Int, phone:String){
this(name,age)
this.phone=phone
}
附属构造器必须在第一行调用祝构造器或者其他的附属构造器。
5.3 继承
语法:
class Cindy(name:String, age:Int, val major:String) extends Girl(name,age){
}
因为Girl这个类不存在参数为空的构造,所以,就得将参数传入。
5.4 重写
重写语法:
override def toString: String = {
"abcd"
}
需要在前头加上override
5.5 抽象类
定义
abstract class Animal{
var name:String
var age = 0
def speek
def dosomething():String
}
上诉定义中, age是被实现的,只有name和speek是抽象,需要重新定义。
实现
class Dog extends Animal{
override var name: String = _
override def speek: Unit = ???
override def dosomething():String={xxxxx}
}
???是占位符,具体要自己去实现,不然调用就会出错。