另一个好处(静态类型语言)是传入传出方法的所有东西都被类型检查器检查,因此逻辑错误会更有可能把自己表现为类型错误。把这个函数式编程的哲学应用到对象世界里以为着使对象不可变。...而Array就可以成功 scala>nums(3)=4 :10: error: value update is not a member of List[Int]...例如: scala>var listStr:List[Object] = List("This", "Is", "Covariant", "Example") listStr:List[Object]...其它类型如String,Object等的子类 scala> var listStr = List() listStr:List[Nothing] = List() scala>var listStr:...: List[Int] = List(6, 5, 4, 3) //构建相同元素的List scala> List.make(5, "hey") res29: List[String] = List(hey
先分享Scala的官方网站:https://docs.scala-lang.org/。 大部分的学习资料都可以在这找到,语言支持切换中文,非常友好。...例如,在Scala中,一切皆为对象,而在Java中,基本类型、null、静态方法等不是对象。在Scala中,成员变量/属性必须显示初始化,而在Java中可以不初始化。...例如: object Main extends App { println("Hello, Scala developer!") } 需要注意的是,这种方法在Scala 3中不再推荐使用。...包对象 在 Scala 中,包对象(Package Object)是一种特殊的对象,它与包同名,并且可以在包中定义一些公共的成员和方法,供包中的其他类和对象直接使用。...在程序中,一个 object 只有一个实例。此外,object 中定义的成员都是静态的,这意味着它们可以在不创建实例的情况下直接访问。而 class 中定义的成员只能在创建实例后访问。
先分享Scala的官方网站:https://docs.scala-lang.org/。大部分的学习资料都可以在这找到,语言支持切换中文,非常友好。...例如,在Scala中,一切皆为对象,而在Java中,基本类型、null、静态方法等不是对象。在Scala中,成员变量/属性必须显示初始化,而在Java中可以不初始化。...需要注意的是,这种方法在Scala 3中不再推荐使用。它们被新的@main方法取代了,这是在Scala 3中生成可以从命令行调用的程序的推荐方法。...包对象在 Scala 中,包对象(Package Object)是一种特殊的对象,它与包同名,并且可以在包中定义一些公共的成员和方法,供包中的其他类和对象直接使用。...在程序中,一个 object 只有一个实例。此外,object 中定义的成员都是静态的,这意味着它们可以在不创建实例的情况下直接访问。而 class 中定义的成员只能在创建实例后访问。
语言支持的数据类型 #一个简单的元组 scala> val t = (1, "a", 2.0, 5L) t: (Int,...scala> def make(more:Int) = (x:Int) => x+more make: (more: Int)Int => Int //方法由三部分组成,make...> val inc1 = make(1) inc1: Int => Int = scala> val inc99 = make...(包括成员字段),都属于主构造器的代码,且执行顺序于代码书写的顺序是一致的,其实与java一样 * 在java中方法之外的代码(成员及代码块),在构造器调用之前最先执行,姑且将这些代码看做也是一个主构造器中进行执行的...[Bird]是不是EatSomething[Animal]的子类?
函数式编程Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。...类型系统具体支持以下特性:泛型类协变和逆变标注类型参数的上下限约束把类别和抽象类型作为对象成员复合类型引用自己时显式指定类型视图多态方法扩展性Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展...在scala是可以对数字等基础类型调用方法的,即数字也是一个对象,不是一个字面量。...用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。...(迭代器)不是一个集合,它是一种用于访问集合的方法。
引用成员函数的实例分析 成员变量与成员函数的对序列化的影响相同,即引用了某类的成员函数,会导致该类所有成员都支持序列化。...此外,与成员变量稍有不同的是,由于该成员函数不依赖特定的成员变量,因此可以定义在scala的object中(类似于Java中的static函数),这样也取消了对特定类的依赖。...此外,也不是map操作所在的类必须序列化不可(继承Serializable类),对于不需要引用某类成员变量或函数的情形,就不会要求相应的类必须实现序列化,如下面的例子所示,filter操作内部没有引用任何类的成员变量或函数...)map等闭包内部直接引用某类成员函数或成员变量 (1)对于依赖某类成员变量的情形 如果程序依赖的值相对固定,可取固定的值,或定义在map、filter等操作内部,或定义在scala object对象中...(2)对于依赖某类成员函数的情形 如果函数功能独立,可定义在scala object对象中(类似于Java中的static方法),这样就无需一来特定的类。
你可能知道的知识 当你声明了一个 case class,Scala 编译器为你做了这些: 创建 case class 和它的伴生 object 实现了 apply 方法让你不需要通过 new 来创建类实例...classMath( b ) B:b 也许你已经知道,在模式匹配中,当你的 case class 没有参数的时候,你是在使用 case object 而不是一个空参数列表的 case class scala...上文提到的所有 case class 的特性在这种定义方式下只作用于第一个参数列表中的参数(比如在参数前自动加 val,模式匹配,copy 支持等等),第二个及之后的参数列表中的参数和普通的 class...firstname和birthYear前不再自动添加 val,不再是类的成员 scala> val p = Person("Lacava")("Alessandro", 1976) p: Person...Boolean = true scala> println ( p.toString ) Person(Lacava) 其他特性不再一一列举.. ---- **传送门: **Scala 在简书目录
= { val list = List(1, 2, 3) println(list) // List(1, 2, 3) // 传统的方式:new 出来 val p1 ... A... // 3、第一个特质构造器 B... // C... // 4、第二个特质构造器的父特质构造器,如果已经执行过,就不再执行 // 5、第二个特质构造器 D.....} class CCC {} // 错误,因为 CCC 类不是特质超类 Exception 的子类 class UnhappyException3 extends CCC with LoggedException...嵌套类的使用1 请编写程序,定义 Scala 的成员内部类和静态内部类,并创建相应的对象实例。...Value 对象 val Club = Value("♣") // 创建了一个 Value 对象 val Heart = Value("♥") // 创建了一个 Value 对象 val Diamond
Unit = { println("Hello, Scala") } } 在Scala中,程序的入口是object对象,object对象无须实例化可以直接运行,你可以认为它是Java的单例对象...Scala的泛型类型使用"[]"而不是像Java那样使用"",因为在Scala中""是有效的方法名,它们有更重要的用途。...2.5 函数声明 函数支持是Scala语言的最大亮点,相对于Java的Lambda和函数式接口,你可以享受到原生的函数式编程。...2.7 class Scala的class定义和Java很相似: class Counter { private var value = 0 def increment() { value +...= 1} //方法可见性默认public def current() = value } 类成员(属性和方法)的可见性默认为public。
正则表达式 scala.util.matching包中提供的Regex类支持和实现正则表达式。...单例是一种只能有一个实例的对象。使用object关键字对象而不是class关键字创建单例。由于无法实例化单例对象,因此无法将参数传递给主构造函数。...object下的成员都是静态的,若有同名的class,这其作为它的伴生类。...在object中一般可以为伴生类做一些初始化等操作 (4)伴生对象 在Java或C++中,通常会用到既有实例方法也有静态方法的类,在Scala中将静态成员分离出来,形成与类同名的伴生对象(companion...defined class Account defined object Account scala> 注意:类和他的伴生对象可以相互访问私有成员,他们必须定义在同一个源文件中。
另外,类可以被子类化,而且Scala还提供了基于mixin的组合(mixin-based composition)。与只支持单继承的语言相比,Scala具有更广泛意义上的类重用。...类型安全: Scala创始人是教授,他先带领创建了java 5编译器,而后觉得Java有太多羁绊而发明了Scala。Scala编译器和类型系统非常强大,它的目标是尽量把软件错误消灭在编写过程中。...类型系统具体支持以下特性:泛型类,型变注释(Variance Annotation),类型继承结构的上限和下限,把类别和抽象类型作为对象成员,复合类型,引用自己时显式指定类型,视图,多态方法。...其他特定:更高层的并发模型Actor、轻量级的函数语法、高阶、嵌套、局部套用(Currying)、与Java无缝地互操作 因为如此众多特性,用Scala可以优雅地编写简洁的代码,同时又能减少很多低级错误...随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件必不可少的工具。 Scala语法 类 构造函数 构造函数不是特殊的方法,他们是除了类的方法定义之外的代码。
(重点)函数可以在变量不再处于作⽤域内时被调⽤。...伴生对象的名称与类的名称相同,但它们的定义使用了 object 关键字而不是 class 关键字。 相对应的,伴生对象和伴生类之间是有关联的。...也就是说,伴生对象可以访问伴生类的私有成员,伴生类也可以访问伴生对象的私有成员。 ...(1)一个类只能集成一个抽象类,但是可以通过with关键字继承多个特质; (2)抽象类有带参数的构造函数,特质不行(如 trait t(i:Int){} ,这种声明是错误的) 12、object和class...3、Nil代表⼀一个List空类型,等同List[Nothing] 4、None是Option monad的空标识(深入了解请参考问题Q11) 16、Unit类型是什什么?
需求 定义一个Person样例类,包含姓名和年龄成员变量 创建样例类的对象实例(“张三”、20) 修改张三的年龄为23岁,并打印 参考代码 object _02CaseClassDemo { case...1, 成员变量2, 成员变量3…),我们可以更方面查看样例类的成员 case class CasePerson(name:String, age:Int) object CaseClassDemo {...,使用Option类型来封装结果 然后使用模式匹配来打印结果 不是除零,打印结果 除零打印异常错误 参考代码 /** * 定义除法操作 * @param a 参数1...泛型 scala和Java一样,类和特质、方法都可以支持泛型。我们在学习集合的时候,一般都会涉及到泛型。...scala> val list1:List[String] = List("1", "2", "3") list1: List[String] = List(1, 2, 3) 那如何自己定义泛型呢?
Nil代表一个List空类型,等同List[Nothing],根据List的定义List[+A],所有Nil是所有List[T]的子类; Null是所有AnyRef的子类,在Scala的类型系统中,AnyRef...Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。迭代器 it 的两个基本操作是 next 和 hasNext。...Either可以提供一些计算失败的信息,Either有两种可能返回类型:预期/正确/成功的 或 错误的信息。...3)main方法只能在object中有效,Scala 中没有 static 关键字,对于一个class来说,所有的方法和成员变量在实例被 new 出来之前都是无法访问的因此class文件中的main方法也就没什么用了...,而object中所有成员变量和方法默认都是static的,所以object中可以直接访问main方法。
例如,List 支持对数字内容执行 sum,但对其他内容却不行。可是 Scala 的数字类型并不都共享一个超类,所以我们不能使用T <: Number。...然后在 List 定义中使用它: sum[B >: A](implicit num: Numeric[B]): B 如果你调用List(1,2).sum(),你并不需要传入一个 num 参数;它是隐式设置的...但如果你调用 List(“whoop”).sum(),它会抱怨无法设置 num。 在没有设定陌生的对象为 Numeric 的时候,方法可能会要求某种特定类型的“证据”。...types — 类型需求由接口构造表示,而不是由具体的类型表示。...def get = 10 }) res0: Int = 133 4.抽象类型成员 在特质中,你可以让类型成员保持抽象。
继承 只能有一个父类 与其他支持面向对象的语言一样,Scala 也支持继承,并且子类只能有一个父类,不能继承于多个父类,如果希望实现类似继承多个父类的功能,应该考虑引入 trait。...虽然只支持一个父类,但是父类还可以有父类,也就是爷爷类,对于类继承的层数是没有具体要求的,这几点在下面这个例子中都有体现: scala> class A { | } defined class...类继承中,允许在子类内部直接访问父类的 public 及 protected 成员及方法,但不允许子类直接访问父类的 private 成员及方法,如下例: scala> class Child1 (...Parent cannot be accessed in Child3 Access to protected value yy not permitted because enclosing object...protected 和 private 的成员和方法: scala> child.testYY res20: String = hello scala> child.testZZ res21: Double
领取专属 10元无门槛券
手把手带您无忧上云