admin 管理员组

文章数量: 1086019


2024年4月16日发(作者:web工作流程)

Scala常见面试题及答案

1. 变长参数跟list作为参数的区别

变长参数只能作为最后一个形参,变长参数在调用传参时语义更明确。

2. 伴生类与伴生对象是什么

同一个文件中同名的object和class,可以相互访问彼此的私有变量(但object中若使用 private

this标注,则伴生类中无法访问)。

伴生对象中可定义apply方法,目的是通过伴生类的构造函数功能,来实现伴生对象的构造函数功

能。

3. 如何实现单例模式

依靠伴生对象,因为对象的创建是单例的。

4. trait特质是什么

可以被多个类继承。

5. A类继承了B类并且继承了C特质、D特质,D特质继承了E类,A在构造时构造器的执行顺序。

执行B的构造器(执行父类构造器),然后是C的构造器(执行继承特质构造器从左到右),执行E

构造器(执行继承特质构造器的父类构造器),执行D构造器,最后是A的构造器。

6. 偏函数与偏应用函数的区别

偏函数时只处理能与至少一个case相匹配情况下的输入。偏应用函数是参数不全(调用函数时使用

了_)的函数。

7. Scala概述

Scala 是一种多范式语言,它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃 Java

这个强大的平台,它运行在 Java 虚拟机 (Java Virtual Machine) 之上,轻松实现和丰富的 Java 类

库互联互通。它既支持面向对象的编程方式,又支持函数式编程。它写出的程序像动态语言一样简洁,

但事实上它确是严格意义上的静态语言,相对于Java而言,Scala的代码更为精简(减低犯错),而且

功能更为广泛(Scala其实是Scalable Language 的简称,意为可扩展的语言),许多Scala的特性和

语法都是针对Java的不足和弱点来设计的。

8. scala语言有什么特点?什么是函数式编程?有什么优点?

scala语言集成面向对象和函数式编程。

函数式编程是一种典范,将电脑的运算视作是函数的运算。与过程化编程相比,函数式编程里的函

数计算可以随时调用。

9. scala中的闭包

定义:你可以在任何作用域内定义函数:包,类甚至是另一个函数或方法。在函数体内,可以访问到

相应作用域内地任何变量。(重点)函数可以在变量不再处于作用域内时被调用。下面就是一个闭包:

def mulBy(factor:Double) = (x:Double) => factor * x

//开始调用

val tripe = mulBy(3)

val half = mulBy(0.5)

println(tripe(14) + " " + half(14))

10. scala中的柯里化

定义:柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返

回一个以原有的第二个参数作为参数的函数,例如:

//该函数接受两个参数

def mul(x:Int,y:Int) = x * y

//该函数接受一个参数生成另外一个接受单个参数的函数

def mulOneAtTime(x:Int) = (y:Int) => x * y

这样的话,如果需要计算两个数的乘积的话只需要调用:mulOneAtTime(5)(4)这就是函数的柯里

化。

11. scala中的模式匹配

scala的模式匹配包括了一系列的备选项,每个替代项以关键字大小写为单位,每个替代方案包括一

个模式或多个表达式,如果匹配将会进行计算,箭头符号=>将模式与表达式分离,例如:

obj match{

case 1 => “one”

case 2 => “two”

case 3 => “three”

case _ => default

}

12. case class和class的区别

case class:是一个样本类,样本类是一种不可变切可分解类的语法糖,也就是说在构建的时候会自

动生成一些语法糖,具有以下几个特点:

自动添加与类名一致的构造函数(也就是半生对象,通过apply方法实现),也就是说在构造对象的

时候不需要使用new关键字。

样本类中的参数默认是val关键字,不可以修改。

默认实现了toString,equals,hashcode,copy方法。

样本类可以通过==来比较两个对象,不在构造方法内地二属性不会用在比较上。


本文标签: 函数 参数 对象 编程 语言