scala语言的特点:
- 集成了面向对象和函数式编程
- 函数式编程是将计算机的运算视为函数运算
- 链式编程
Scala中的String是可变的还是不可变的
- 它的底层就是Java的String,所以是不可变的
什么是闭包
函数捕获自由变量的,闭包=代码+非局部变量
简述隐式转换的作用
当我们引入第三方包,但是不能修改代码时。可以使用隐式转换增加新的功能,类似与Java的装饰器模式,必须保证当前环境下只有能被识别
什么是柯里化
接受一个多参数的函数转换为多个单参数的函数列表
作用:
- 简化了主函数的复杂度
- 提高了主函数的自闭性
- 提高了主函数的抽象能力
Scala中特质的调用链
从右到左,从下到上,如果中间有没有调用super的,调用链就停止在这里
Scala的协变,逆变,非变
首先定义的一个Trait Q[T]{}
- 协变 : 如果 A 是B的子类,那么Q[A] 是 Q[B]的子类,Q这样定义Trait Q[+T]{}
- 逆变: 如果A是B的子类,那么Q[B]是Q[A]的子类,Q这样定义Trait Q[-T]{}
- 非变: 没有任何从属关系,Q这样定义Trait Q[T]{}
Object的作用
- 伴生对象
- 作为工具类或者放置常量
- 高效共享单个不可变的实列
- 单例模式
trait(特质)和abstract class(抽象类)的区别?
trait 使用 extends with实现多继承
trait中可以定义实例方法
trait可以有构造函数,但只能是无参数的
trait可以直接使用with混入对象
trait可以继承class
case class (样本类)是什么?
一种语法糖
默认实现是伴生对象
默认实现了apply,unapply,tostring,equals,copy,hashcode
可以使用==比较内容
由于实现了apply方法,可以不使用new 关键字实例化
样本类中的参数默认是val关键字,不可以修改
伴生对象是什么?
它由在同一个源文件中同名的class,object组成。
object可以访问class中的私有变量
不能private[this]变量
可以实现JAVA中的静态变量的效果
类也可以访问伴生对象中的私有方法
Scala类型系统中Nil, Null, None, Nothing四个类型的区别?
Nil表示空类型的List ,等同与List[Nothing]
Null是AnyRef的子类,由唯一的实例对象null
Nothing是所有类型的子类,没有实例对象
None是Option的子类
尾递归
正常递归,每一次递归步骤,需要保存信息到堆栈里面,当递归步骤很多时,导致堆栈溢出。 尾递归就是为了解决上述问题,在尾递归中所有的计算都是在递归之前调用, 编译器可以利用这个属性避免堆栈错误,尾递归的调用可以使信息不插入栈,从而优化尾递归。 使用 @tailrec 标签可使编译器强制使用尾递归。
高阶函数
高阶函数指能接受或者返回其他函数的函数,scala中的filter map flatMap函数都能接受其他函数作为参数