scala常见笔试题

这篇博客探讨了Scala编程中的关键概念,包括var、val、def的区别,trait与抽象类的不同,object与class的特性,以及case class、异步计算、Option类型等。还详细解释了unapply和apply方法,伴生对象,Scala类型系统中的Nil、Null、None、Nothing,并深入讨论了函数柯里化、尾递归和高阶函数等高级特性。
摘要由CSDN通过智能技术生成

Q1  var,val和def三个关键字之间的区别?

var是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改。
val常量声明关键字。
def 关键字用于创建方法(注意方法和函数的区别)
还有一个lazy val(惰性val)声明,意思是当需要计算时才使用,避免重复计算

代码示例:
var x = 3 //  x是Int类型
x = 4      // 
x = "error" // 类型变化,编译器报错'error: type mismatch'
val y = 3
y = 4        //常量值不可更改,报错 'error: reassignment to val'
def fun(name: String) = "Hey! My name is: " + name
fun("Scala") // "Hey! My name is: Scala"
//注意scala中函数式编程一切都是表达式
lazy val x = {
  println("computing x")
  3
}
val y = {
  println("computing y")
  10
}
x+x  //
y+y  // x 没有计算, 打印结果"computing y" 

Q2 trait(特质)和abstract class(抽象类)的区别?

(1)一个类只能集成一个抽象类,但是可以通过with关键字继承多个特质;
(2)抽象类有带参数的构造函数,特质不行(如 trait t(i:Int){} ,这种声明是错误的)

 Q3 object和class的区别?

object是类的单例对象,开发人员无需用new关键字实例化。如果对象的名称和类名相同,这个对象就是伴生对象(深入了解请参考问题Q7)

代码示例
//声明一个类
class MyClass(number: Int, text: String) {
  def classMethod() = println(text)
}
//声明一个对象
object MyObject{
  def objectMethod()=println("object")
}
new MyClass(3,"text").classMethod() //打印结果test,需要实例化类
Myclass.classMethod()  //无法直接调用类的方法
MyObject.objectMethod() //打印结果object,对象可以直接调用方法

Q4 case class (样本类)是什么?

样本类是一种不可变且可分解类的语法糖,这个语法糖的意思大概是在构建时,自动实现一些功能。样本类具有以下特性:
(1)自动添加与类名一致的构造函数(这个就是前面提到的伴生对象,通过apply方法实现),即构造对象时,不需要new;
(2)样本类中的参数默认添加val关键字,即参数不能修改;
(3)默认实现了toString,equals,hashcode,copy等方法;
(4)样本类可以通过==比较两个对象,并且不在构造方法中定

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值