乐趣区

关于scala:Scala-变量块方法函数的定义以及数据类型

变量定义

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

数据类型

  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 是所有类型的子类。
退出移动版