Scala - 变量、块、方法、函数的定义以及数据类型

变量定义

在java中,咱们是这样定义变量的:java

String str = "hello";
int num = 1;

在Scala中,咱们是这样定义变量的:函数

val str: String = "hello"
var num: Int = 1;

这两个的区别:spa

  • java是先声明变量的类型,而后定义变量的名称
  • Scala是经过var定义变量的名称,而后在变量后面加他的类型
  • Scala也能够不指定他的类型,那Scala会根据赋值来类型推断变量的类型。因此下面的语句就会打印int和class java.lang.String。
  • Scala变量类型定义后,就不能对类型进行修改,因此咱们下面注释掉的语句是编译不过去的,这个和java同样。scala

    var obj1 = 1
    println(obj1.getClass)
    //obj1 = "obj1"
    
    var obj2 = "obj2"
    println(obj2.getClass)
    //obj2 = 1

    val

    java的final和Scala的val雷同都是用来修饰不可变的变量,若是是值类型,那这个值不能改变,若是是对象类型,那这个对象的引用不可改变。
    java的final,注释掉的语句是编译不过去的:code

    final int fNum = 1;
    // fNum=2;//Cannot assign a value to final ariable 'fNum'

    Scala的val,注释掉的语句是编译不过去的:对象

    val fNum = 1
    //fNum = 2

    懒加载

    经过lazy val来定义一个懒加载get

    lazy val lz = {
    println("lazy")
    "lz"
    }
    println("-----")
    println(lz)

    打印结果以下,说明在定义的时候,并无运行打印的方法,只有在实际调用lz的时候,才会调用println("lazy")。编译器

    -----
    lazy
    lz

块表达式

块表达式是用{}包裹起来的多个表达式,其中最后一个表达式就是这个块的返回值。
下面的块表达式,x的值为1。hash

var x = {
  println("block")
  1
}
println(x)

函数的定义

函数定义的时候,左边是传入的参数,右边是块表达式(若是只有一句能够省略{}),中间的符号是=>
好比咱们定义一个匿名函数:it

(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())// 输出()

数据类型

  1. Any是全部类型的超类型,也称为top类型。它定义了某些通用方法,如equals、hashCode和toString。Any有两个直接子类:AnyVal和AnyRef。
  2. AnyVal是全部值类型的父类,包括Double, Float, Long, Int, Short, Byte, Char, Boolean, Unit。前面几个相似java的基本类型的包装类,Unit相似java的void,在scala里也是AnyVal的子类。
  3. AnyRef是全部引用类型的父类,相似于java的Object。
  4. Null是全部引用类型的子类,相似java中的null。
  5. Nothing是全部类型的子类。