apply 和 unapply 方法
apply方法一般被称为注入方法一般用于伴生对象初始化的操作,apply方法的参数列表不需要和构造函数的参数列表统一
unapply方法常被称为提取方法可以用unapply方法提取相同操作的对象,unapply方法会返回一个Option,其内部生成一个Some对象,这个Some是做相似对象的封装,unapply常被用于模糊匹配
apply方法和unapply方法都被隐式的调用
private关键字
在class前面使用private[包名]代表是包的访问权限,只能指定的包名下才能访问
在包名和构造器的参数列表中间加private是指伴生对象的访问权限,只有伴生对象才能访问
变量前加private,此时该字段成为私有字段,伴生对像能访问
变量前加private[this],此时该字段成为私有字段,伴生对像不能访问
方法前加private,此时该字段成为私有方法,伴生对像能访问
方法前加private[this],此时该字段成为私有方法,伴生对像不能访问
package com.hainiuprivate[hainiu class PrivateDemo private (val sex:String,var other:String){private val name:String = "hainiu"private[this var age:Int = 24private def action():Unit = {println(s"name:$name,age:$age")}private[this def action1():Unit = {println(s"name:$name,age:$age")}}object PrivateDemo{def main(args: Array[String): Unit = {val demo = new PrivateDemo("","")println(demo.name)println(demo.action)}}object Test{def main(args: Array[String): Unit = {// val demo = new PrivateDemo("","")}}特质与抽象类
抽象类:
抽象类与Java相似,只是Java中没有属性的抽象
特质:
可以把特质理解成Java中升级版的接口
在Java中接口不能声明没有值的属性和有实现的方法而Scala可以
重写:
重写与Java相似,只是Java中没有重写属性的概念
特质和抽象类的使用区别:
只能继承一个抽象类,但可以实现多个特质。这点和Java一样
语法注意:当不继承类直接实现一个特质,可以不用with直接用extends,实现多个特质的时候可以用多个with,但是必须先extends第一个特质
trait Type1{val aaa:String}trait Type2{val bbb:String}class benz extends Type{override val energy: String = _override val power: String = _}class benz1 extends Type with Type1 with Type2{override val energy: String = _override val power: String = _override val aaa: String = _override val bbb: String = _}模式匹配
类似Java中的switch case,但比Java中的强大的多,不仅可以匹配字段串、类、元组、集合等
和Java有一点不同就是匹配不到会摄氏,这个需要注意一下
语法
变量 match{
case "值" => 函数体1
case "值2" => 函数体2
}
字体串匹配
数组、元组、集合匹配
元组匹配时case后面的值的个数应与被匹配的元组中数据的个数相同,否报错。
当有多个条件能匹配到时以最先匹配到的条件为准
偏函数匹配
PartialFunction[A,B]其中A是方法参数类型,B是方法返回值类型,PartialFunction(偏函数)常用作模式匹配,可以用自定义的方法代替