变量定义
在java中,我们是这样定义变量的:
String str = "hello";
int num = 1;
在Scala中,我们是这样定义变量的:
val str: String = "hello"
var num: Int = 1;
这两个的区别:
- java是先声明变量的类型,然后定义变量的名称
- Scala是通过var定义变量的名称,然后在变量后面加他的类型
- Scala也可以不指定他的类型,那Scala会根据赋值来类型推断变量的类型。所以下面的语句就会打印int和class java.lang.String。
Scala变量类型定义后,就不能对类型进行修改,所以我们下面注释掉的语句是编译不过去的,这个和java一样。
var obj1 = 1 println(obj1.getClass) //obj1 = "obj1" var obj2 = "obj2" println(obj2.getClass) //obj2 = 1
val
java的final和Scala的val雷同都是用来修饰不可变的变量,如果是值类型,那这个值不能改变,如果是对象类型,那这个对象的引用不可改变。
java的final,注释掉的语句是编译不过去的:final int fNum = 1; // fNum=2;//Cannot assign a value to final ariable 'fNum'
Scala的val,注释掉的语句是编译不过去的:
val fNum = 1 //fNum = 2
懒加载
通过lazy val来定义一个懒加载
lazy val lz = { println("lazy") "lz" } println("-----") println(lz)
打印结果如下,说明在定义的时候,并没有运行打印的方法,只有在实际调用lz的时候,才会调用println("lazy")。
----- lazy lz
块表达式
块表达式是用{}包裹起来的多个表达式,其中最后一个表达式就是这个块的返回值。
下面的块表达式,x的值为1。
var x = {
println("block")
1
}
println(x)
函数的定义
函数定义的时候,左边是传入的参数,右边是块表达式(如果只有一句可以省略{}
),中间的符号是=>
。
比如我们定义一个匿名函数:
(x: Int) => x + 1
给函数一个名称:
var fun1 = (x:Int)=> x+1
println(fun1(10))//输出11
无参函数:
var fun2=()=>10
println(fun2())
方法的定义
方法的定义跟函数的定义雷同,首先是定义方法的关键字def,然后是参数的类型,返回值的类型,=
,最后是方法体。
def add(x: Int, y: Int): Int = x + y
如果是无参的话,参数类型可以不写。另外返回值也可以不写,编译器会自动推断。
def method1()={
1
}
println(method1())// 输出1
如果=
也没有写,那这个方法的返回值就是Unit,等同于java的void。
def method2(){
1
}
println(method2())// 输出()
数据类型
- Any是所有类型的超类型,也称为top类型。它定义了某些通用方法,如equals、hashCode和toString。Any有两个直接子类:AnyVal和AnyRef。
- AnyVal是所有值类型的父类,包括Double, Float, Long, Int, Short, Byte, Char, Boolean, Unit。前面几个类似java的基本类型的包装类,Unit类似java的void,在scala里也是AnyVal的子类。
- AnyRef是所有引用类型的父类,类似于java的Object。
- Null是所有引用类型的子类,类似java中的null。
- Nothing是所有类型的子类。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。