上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是能够对数字等基础类型调用方法的。例如数字1能够调方法,使用1.方法名。scala拥有和java同样的数据类型,和java的数据类型的内存布局彻底一致,精度也彻底一致。html
Unit:表示没有返回值;java
Nothing:表示没有值,是全部类型的子类型,建立一个类就必定有一个子类是Nothing;函数
Any:是全部类型的超类;布局
AnyRef:是全部引用类型的超类spa
如上两图所示,可见全部类型的基类是Any。Any以后分为两个AnyVal与AnyRef。其中AnyVal是全部数值类型的父类型,AnyRef是全部引用类型的父类型。scala
Scala还定义了底类型,其中Null类型是全部引用类型的底类型,全部AnyRef的类型的空值都是Null;而Nothing是全部类型的底类型和Any类型相对应,Null与Nothing都表示空。3d
String继承自AnyRef。与Java,Scala中的String也是内存不可变对象,及全部的字符串操做都会产生新的字符串。code
Int等基础类型都是Scala包装的类型,例如Int类型对应的是Scala.Int只是Scala包会被每一个源文件自动引用。htm
Option类型用来表示可能存在、也可能不存在的值。样例子类:Some("Fred")表示包装了某值。样例:None表示没有值。对象
常量声明使用“val”值不可改变。
val firstname : String = "wang" val lastname = "xiaoming" //能够省略类型
变量声明使用“var”值能够改变。
var name:String = "sean" var myname = "fengjia" //能够省略类型
函数或者表达式的声明使用“def”
object HelloScala { def main(args: Array[String]): Unit = { println(x) println(y) } val a = 3 var b = 2 val x = a * b //定义常量名"x",会直接计算值 def y = a * b //这里只是定义表达式名字"y",不计算值 }
同java注释相同:单行注释“//”,多行注释“/* **/”
同java字符串。
scala中能够定义多行字符串
var str = """ hello scala """
s字符串能够调用“变量/常量”,在字符串前面加s,在字符串中使用“$变量/常量名”的数学表达式,来调用变量。字符串以前不写s,则原样输出。
val name = "sean" println(s"hello $name") println("hello $name")
输出:
hello sean hello $name
在字符串前加f使用格式化变量功能。变量名后面加%s是表示字符串,变量名后面加%.2f是精确到百分位。
val name = "sean" val height = 1.7 println(f"hello $name%s is $height%.2f") println(s"hello $name%s") println("hello $name%s is $height%.2f")
输出:
hello sean is 1.70 hello sean%s hello $name%s is $height%.2f
在scala中若是要输出“\t”、“\n”等字符串时须要加转义符“\”不然会按照制表符或换行符输出。r字符串的使用是在字符串前面加raw,则能够将“\t”、“\n”等原样输出。
println("a\tb") println(raw"a\tb")
输出:
a b a\tb
函数简化形式
Scala中,能够不写return,若是不写return则自动将最后一行做为返回值,若是没有返回值,则函数的返回类型为Unit,相似于Java中void。
def max(x:Int,y:Int)={ if (x>y) x else y }
这里还能够进一步把方法体的花括号也省略,因此函数能够进一步简化为
def min(x:Int,y:Int)= if(x<y) x else y
案例一(单个参数,参数设置初始值)
定义sayMyName方法,方法须要一个参数,类型是String,默认值是sean。若是使用参数则按照参数计算,若是不适用参数则使用默认值。
object HelloScala2 { def main(args: Array[String]): Unit = { sayMyName() sayMyName("jiafeng") } def sayMyName(name:String = "sean"): Unit ={ println(name) } }
案例二(可变参数)
多个相同类型的参数可使用*表示,例如(k : Int*)表示多个Int类型的参数,具体数量不肯定,相似于java中的可变参数。
def main(args: Array[String]): Unit = { var sum = sumParam(1,2,3,4,5) println(sum) } def sumParam(n : Int *) ={ var sum = 0 for (i <- n){ sum += i } sum }
案例三(下划线作参数)
调用add方法使用下划线是一个符号表示一个变量名。
def main(args: Array[String]): Unit = { var add = add2(5) println(add) } def add(a : Int,b : Int) = a + b def add2 = add(_ : Int,1)
递归实际上就是方法本身调用本身,也能够称之为递归公式。
def main(args: Array[String]): Unit = { var f = fact(9) println(f) } def fact(n : Int) : Int = { if(n <= 0){ println("if:"+n) 1 }else{ println("else:"+n) n * fact(n - 1) } }
执行结果
else:9 else:8 else:7 else:6 else:5 else:4 else:3 else:2 else:1 if:0 362880
https://www.cnblogs.com/yangp/p/8575705.html