Scala基础概念

本文深入解析Scala中的关键概念,包括var、val、def的区别,trait与abstract class的应用场景,object与class的不同之处,以及Option类型的意义。同时探讨了高阶函数、函数柯里化等高级特性,并介绍了comprehensions的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    var 为定义变量,类似于Java中的变量,变量值可以更改,但是变量类型不能更改。

    val 为定义常量.

    def 为创建函数(注意方法和函数的区别)

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

    ​ 如果你想定义一个类似接口的类型, 但是可能会在特质和抽象类之间难以取舍. 这两种形式都可以定义一个类型的一些行为, 并要求继承者定义一些其他行为.

    优先使用特质. 一个类扩展多个特质是很方便的, 但却只能扩展一个抽象类.

    如果需要构造函数参数, 使用抽象类. 因为抽象类可以定义带参数的构造函数, 而特质不行. 例如, 不能说trait t(i: Int) {}, 参数i是非法的.

    总结:

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

  3. object和class的区别?

    object是单例对象,相当于Java中的工具类,可以看成是定义静态的方法,object不可以传参数

    class类 默认可以传参数,默认的传参数就是默认的构造函数,重写构造函数的时候,必须要调用默认的构造函数.

  4. 伴生对象是什么?

    如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类,可以互相访问私有变量.

  5. Scala类型系统中Nil, Null, None, Nothing四个类型的区别?

    Null:Trait,其唯一实例为null,是AnyRef的子类,不是AnyVal的子类

    Nothing:Trait,所有类型(包括AnyRef和AnyVal)的子类,没有实例

    None:Option的两个子类之一,另一个是Some,用于安全的函数返回值

    Nil:长度为0的List

  6. Unit类型是什么?

    无返回值的函数的类型,和Java的void一样

  7. Option类型的定义和使用场景?

    在Java中,null是一个关键字,不是一个对象,当开发者希望返回一个空对象时,却返回了一个关键字,为了解决这个问题,Scala建议开发者返回值是空值时,使用Option类型,在Scala中null是Null的唯一对象,会引起异常,Option则可以避免。Option有两个子类型,Some和None(空值)

  8. 解释隐示参数的优先权

    在Scala中implicit的功能很强大。当编译器寻找implicits时,如果不注意隐式参数的优先权,可能会引起意外的错误。因此编译器会按顺序查找隐式关键字。顺序如下:
    (1)当前类声明的implicits ;
    (2)导入包中的 implicits;
    (3)外部域(声明在外部域的implicts);
    (4)inheritance
    (5)package object
    (6)implicit scope like companion objects

  9. 什么是函数柯里化?

    可以把柯里化函数想象为高阶函数的简化版

     /**
         * 柯里化函数
         */
        def fun7(a :Int,b:Int)(c:Int,d:Int) = {
          a+b+c+d
        }
        println(fun7(1,2)(3,4))
    
    
  10. 什么是高阶函数?

    函数的参数是函数,

    函数的返回类型是函数,

    函数的参数和函数的返回是函数.

  11. yield如何工作?

    comprehension(推导式):是若干个操作组成的替代语法。如果不用yield关键字,comprehension(推导式)可以被forech操作替代,或者被map/flatMap,filter代替。

    yield用于循环迭代中生成新值,yield是comprehensions的一部分,是多个操作(foreach, map, flatMap, filter or withFilter)的composition语法糖。

  12. 偏应用函数和偏函数的区别

    偏应用函数时在某些情况下,方法中参数非常多,调用这个方法非常频繁,每次调用只有固定的某个参数的变化,其他都不变,可以定义偏应用函数.

    偏函数是一个Trait,其类型为prtialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果

  13. case class (样本类)是什么?

    使用了case关键字的类定义就是样列类,样列类是种特殊的类,实现了类构造餐宿的getter方法,当构造参数是声明为var类型的,它帮助你实现setter和getter方法

    case class 实现了toString,equals,copy和hashCade等方法

    case class 可以new 也可以不new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值