scala类:java
scala中类定义里,能够放置字段和方法,这些被统称为成员(memeber)闭包
全部成员默认是共有的,如java中默认带public同样app
scala中不能定义静态成员,可是能够定义单例对象,用法java的static成员用法同样,对象名.成员。函数
若是定义的一个class A与object A而且他们在同一个文件里面他们就是伴生关系(singleton)class A是 object A的伴生类,反过来object A是class A的伴生对象,他们能够相互访问对方的私有成员ui
scala中private修饰了的成员,同一个类型的对象能够访问另外一个同类型的私有成员.如:this
classA{private val other = 1; def A(a:A){a.other+1}}
spa
限定只能当前类使用:使用private[this]scala
classA{private[this] val other = 1; def A(){other+1}}对象
scala中的构造器有一个主构造器和多个副构造器,组构造器是在建立class A类的时候就已经定义了,若是让主构造器new 的时候就带参数就class A(val name : String){ }必需要带上val或var,否则他不会生成对应成员,只是当作一个val的构造器参数。
递归
若是成员加上@BeanProperty 注解 如:@BeanProperty var name : String = "" scala会默认的给他生成getName和setName这2个方法。
若是想让主构造器变成私有的能够class A private (val name : String){ def this(){this(name)} } 这样用户只能调用副构造器来构造A对象了。主构造器是有参构造,副构造器是无参构造。
若是有确实值class A private(val name : String = "san"){}用到时的时候能够new A就能够获得类的实例。
scala中的嵌套类的建立方式 new 外部类.嵌套类,java中的内部类的建立方式 new 外部类().new 内部类();而且在scala在使用嵌套类的时候他的类型是为外部类.嵌套类(如类型为 my.foot 或 her.foot)表示这个个人脚与她的脚是不通的类型。
scala中的类型投影:val a = new ArrayBuffer[Network#Member] 其含义是“任何Network的Member”
require(d != 0) 是Scala 中的方法、主构造器要求调用发必须知足的先决条件,是一种限制,确保了程序的正常运行。看起来功能相似于断言机制,可是 Scala 中也有断言啊,因此我目前还不明白这二者的区别所在。
闭包:函数字面量在运行时建立的函数值被称为闭包。如:var y=1;val addMore = (x:Int) => x+y
闭封项:不带自由变量的函数字面量被称为闭封项。如:val addMore = (x:Int) => x + 1
重复参数:def echo(args : String*) = args.foreach(println);String*的args其实是Array[String],若是你想将Array[String]类型当作参数传去echo中的话,传入的时候加上"_*",这个是标注告诉编译器把arr的原素当作参数,而不是单一的参数传给echo。val arr=Array("Hello","world"); val a = echo(arr: _*);
尾递归:当递归最后一个动做是调用本身的函数时咱们就称这个递给是尾递归。
柯里化(currying):柯里化的函数是被应用于多个参数列表,而不单单是一个。
如:def a(x:Int,y:Int) = x + y; 柯里化后:def a(x:Int)(y:Int) = x + y;
柯里化的实质是先传入x=1,返回一个函数 def b(y:Int) = 1 + y;在将y传入获得值。
传递一个函数:def a(x:Int,func:(Int,Int)=>Int),func就是传入一个带2个Int参数,返回一个Int值得函数。
传名参数:def a(x : => Boolean){ println(x)};def b(x : ()=> Boolean){ println(x)}省略(),调用的时候能够
a(1>2),但是函数b只能b(()=>1>2)。传名参数是先建立一个函数,其apply方法将评估1>2。在传递给a.与
def c(x:Boolean){println(x)}不同,c(1>2)是先评估1>2的值直接传给c