1、Trait
一个类继承trait时,第一个关键字使用extends,之后使用with
trait Read{
def read(name:String) {
println(s"$name is reading.....")
}
}
trait Listen {
def listen(name: String) {
println(s"$name is listening.....")
}
}
class Person() extends Read with Listen {
}
object Demo9_Trait1 {
def main(args: Array[String]): Unit = {
val p = new Person()
p.read("zhangsan")
p.listen("lisi")
}
}
Trait中可以有方法体的实现或者方法体中没实现的,子类中要实现未实现的方法
trait IsEquale{
def isEqu(o:Any):Boolean
def isNotEqu(o:Any):Boolean = !isEqu(o)
}
class Point(xx:Int,xy:Int)extends IsEquale {
val x = xx
val y = xy
override def isEqu(o:Any):Boolean={
o.isInstanceOf[Point]&&o.asInstanceOf[Point].x == this.x
}
}
object Demo10_Trait2 {
def main(args: Array[String]): Unit = {
val p1 = new Point(xx=1,xy=2)
val p2 = new Point(xx=1,xy=3)
println(p1.isEqu(p2))
println(p1.isNotEqu(p2))
}
}
2、Match 模式匹配、
1)case _ 什么都匹配不上,放在最后
2)match可以匹配值,还可以匹配类型
3)匹配过程中会有数值的转换
4)从上网下匹配,匹配上会自动终止
5)模式匹配外面的括号可省略
object Demo11_Match {
def main(args: Array[String]): Unit = {
val tp = (1,1.2,"abc",'a',true)
val iter = tp.productIterator
iter.foreach(MatchTest)
}
def MatchTest(o:Any): Unit ={
o match {
case 1=>println("value is 1")
case i=>println(s"type is Int, value is $i")
case d=>println(s"type is Double, value is $d")
case s=>println(s"type is String, value is $s")
case 'a'=>println("value is a")
case _=>{println("no match...")}
}
}
}
3、偏函数 PartialFunction
偏函数,只能匹配一个值,匹配上返回某个值B
PartialFunction[A,B] A是匹配类型,B是匹配上返回类型
object Demo12_PartialFun {
def MyTest:PartialFunction[String,Int]={
case "abc"=>2
case "a"=>1
case _=>200
}
def main(args: Array[String]): Unit = {
val result = MyTest("abc")
println(result)
println(MyTest("abcd"))
}
}
4、样例类 CaseClass
/**
* 样例类
* 1、使用case定义的类就是样例类,
* 实现了类构造参数的getter方法(默认构造被声明为val),
* 当构造参数是var时,它将帮你实现setter和getter方法
* 2、样例类默认实现了toString,equals。copy和hashCode等放法
* 3、样例类可以new,也可以不new
*/
case class Person1(name:String,age:Int){
}
object Demo13_CaseClass {
def main(args: Array[String]): Unit = {
val p1 = new Person1("zhangsan",19)
val p2 = new Person1("zhangsan",19)
println(p1.equals(p2))
println(p1)
}
}