`
wbj0110
  • 浏览: 1611384 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

scala-类

阅读更多

简单类和无参方法

 

Scala中的类不声明为public,一个Scala源文件中可以有多个类。

调用无参方法时,圆括号是可写可不写的。推荐的做法是:如果是会改变对象状态的方法,就带上( );否则,就不带。

如果将方法的声明改为以下形式,那么可以强制不能带( )(下面要提到的getter就是这种风格的,所以调用getter时,必须不带( )):

 

带getter和setter的属性

在Java中,通常将字段声明为私有的,然后添加公有的getter和setter方法来提供访问字段的接口。像这样拥有一对getter/setter的字段,通常被称为属性(property)。

Scala对每个字段都提供了getter和setter方法。

在面向JVM的类中,这个简单的Person类有一个私有的age字段和相应的,公有的getter和setter方法。(如果将age声明为private的,getter和setter方法也是私有的。)Scala中,getter和setter分别叫做age和age_=。

将这个简单的Person编译后,使用javap查看生成的字节码,可以验证这一点。

 

知道了这些默认实现后,就可以使用自己的实现来代替默认实现了。

Scala中,字段和getter/setter间的关系,还有其他几种情况。

使用val声明的字段,是只有getter,因为val声明的是不可变的啊。Scala中不能实现只有setter的字段。

还有种对象私有字段。Scala中,方法可以访问该类的所有对象的私有字段,这一点与Java一样。如果通过private[this]来字段来修饰,那么这个字段是对象私有的,这种情况下,不会生成getter和setter。对象私有字段,只能由当前对象的方法访问,而该类的其他对象的方法是无法访问的。如果说分不清楚对象和类的区别,这里就又要犯浑了。

接下来是一种与private[this]相似的访问控制。Scala中可以使用private[class-name]来指定可以访问该字段的类,class-name必须是当前定义的类,或者是当前定义的类的外部类。这种情况会生成getter和setter方法。

Bean属性(L1)

使用 @BeanProperty注解来为字段生成符合JavaBeans规范的getter/setter方法。使用该注解后,将会生成4个方法:Scala的getter/setter和JavaBeans规范的getter/setter(如果是val声明,就没有setter部分了)。

 

构造器(Constructor)

在Scala中,有两种构造器,主构造器(primary constructor)和辅助构造器(auxiliary constructor)。

辅助构造器

首先来讨论辅助构造器,因为比主构造器更容易理解。辅助构造器与Java构造器很相似,但有两点不同:

  • 名字是this(Java中构造器名称与类名相同)
  • 辅助构造器必须以对已经定义的辅助构造器或主构造器的调用开始

 

 

 

主构造器

Scala中每个类都有主构造器,并且是与类定义混合在一起的。

主构造器的参数,是类名后()内的内容。

主构造器的参数被编译成字段,其值被初始化成构造时传入的参数,可以为这些字段也加上访问控制。

主构造器会执行类定义中的所有语句。

定义如上一个简单类,然后创建一个Person的对象,结果如下:

也就是说,主构造器会将类定义内的,也就是{ }内的,所有语句执行一次。

如果主构造器参数不带val或var,那么会根据是否被方法使用来决定。如果不带val或var的参数被方法使用了,它会变为对象私有字段;如果没有被方法使用,则被当成一个普通的参数,不升级成字段。

主构造器或许不太好理解。Martin Odersky建议如此看主构造器:Scala中的类也接受参数,像方法一样。

可以将主构造器变为私有的,将private关键字放在圆括号前:

 

嵌套类(L1)

在Scala中,几乎可以在任何的语法结构中内嵌任何语法结构。可以类中定义类,也可以在方法中定义方法。

Scala中每个实例都有自己的内部类。参考下面这段代码:

chatter.Member类和myFace.Member类是不同的两个类。这一点与Java是不同的。

由于这一点特征,使得一些地方可能会碰见错误,这时候或许需要调整一下内部类。可以使用的方法有使用伴生对象或者使用类型投影(这里是将内部类中的Member换成NetWork#Member)。

与Java中一样,如果需要在内部类中使用外部类的引用,使用 外部类名.class的语法即可。不过Scala中有一个为这种情况服务的语法:

 


本章习题解答。答案仅供参考,并不代表我的观点。
5.

 

生成的方法:

生成的JavaBeans方法当然应该是可以在Scala中调用的(不然有什么意义…)。不过个人不推荐在Scala中使用,这只是为了符合JavaBeans规范而已。

7.

主构造参数到底是什么样的,推测是普通参数,因为并没有在任何方法中使用过。看字节码验证。

字节码中并没有出现name,所以如我所想,是普通参数。

8.
主构造器4个参数,并且有默认参数。

 

http://nerd-is.in/2013-08/scala-learning-classes/

分享到:
评论

相关推荐

    scala-xml_2.12-1.0.6-API文档-中文版.zip

    赠送jar包:scala-xml_2.12-1.0.6.jar; 赠送原API文档:scala-xml_2.12-1.0.6-javadoc.jar; 赠送源代码:scala-xml_2.12-1.0.6-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.12-1.0.6.pom; 包含翻译后的API...

    scala-intellij-bin-2016.3.9

    - **代码导航**:通过“Go to Declaration”等功能,快速定位到方法或类的定义,提高开发效率。 - **代码补全**:智能代码补全功能将根据上下文提供合适的建议,加快编码速度。 - **重构**:提供高级重构工具,如...

    Scala-2.11.1.zip

    2. **面向对象编程**:Scala支持传统的面向对象编程,包括类、接口、继承和多态。不过,它还引入了特质(trait),这是一种更轻量级的继承方式,可以用来实现多重继承和混合行为。 3. **函数式编程**:Scala是函数...

    scala-intellij-bin-2020.2.3.zip

    - **类与对象**:Scala中的类和对象是统一的,可以创建无实例的静态类(名为对象)。 - **特质(Traits)**:提供了一种实现多重继承的机制。 - **函数式编程**:Scala支持lambda表达式和不可变数据结构,鼓励...

    scala-intellij-bin-0.41

    3. 代码导航:插件支持快速跳转到类、方法或变量的定义,便于理解代码结构和功能。 4. 错误检测:在编写过程中,插件能实时检查代码,显示潜在错误和警告,帮助开发者在运行前修复问题。 5. 重构工具:提供强大的...

    scala-2.12.11.zip

    4. **面向对象编程**:Scala也是面向对象的,支持类、对象、继承、封装和多态。特别的是,Scala的每一切都是一个对象,包括函数,这使得函数可以作为第一类公民来处理。 5. ** Actors模型**:Scala内置了Akka库,...

    scala-2.12.10.zip

    Scala的语法优雅且富有表达力,它允许开发者使用函数式编程的特性,如高阶函数、柯里化、模式匹配和不可变数据结构,同时保留了面向对象的类、接口和继承。这使得Scala成为处理大数据、并发和分布式计算的理想选择,...

    scala-2.12.13.tgz

    - **高阶函数**:函数在Scala中被视为第一类公民,可以作为参数传递,也可以作为返回值。 - **Actor模型**:Scala内置对Akka框架的支持,实现高效的并发处理。 - **FP特性**:包括不可变数据结构、尾递归优化和类型...

    scala-intellij-bin-2021.3.6.zip

    2. **模式匹配**:Scala的模式匹配功能使得处理数据结构和解析数据变得更加简单,它可以与case类和枚举类型一起使用,实现强大的数据解构。 3. **函数式编程**:Scala支持高阶函数和闭包,可以定义匿名函数,使用...

    scala-intellij-bin-2019.2.20.zip

    2. Scala运行时库:这是Scala程序运行所必需的库,包含了许多内置类和函数,以及对Java标准库的扩展。 3. Scala IDEA插件:提供了对Scala语言的语法高亮、代码自动完成、错误检测、重构工具、调试器支持等功能,极...

    scala-intellij-bin-2020.2.23.zip

    1. **语法高亮与代码提示**:Scala插件提供对Scala语法的准确识别,包括类、对象、函数、变量、类型注解等,同时在编写过程中提供实时的代码补全建议。 2. **错误检查与智能感知**:在编写代码时,插件会实时分析并...

    scala-intellij-bin-2017.2.6

    7. **代码导航**:能够快速跳转到方法定义、类的实现或引用,提升代码浏览和理解的速度。 8. **版本控制集成**:与Git等版本控制系统无缝对接,方便代码提交和回滚。 9. **JUnit和ScalaTest支持**:方便编写和运行...

    scala-intellij-bin-2020.1.39.zip

    3. **重构工具**:支持Scala语言特有的重构操作,如提取方法、重命名变量、移动类等,有助于保持代码的整洁和可维护性。 4. **调试支持**:插件提供了强大的调试工具,包括设置断点、单步执行、查看变量值等功能,...

    scala-2.12.6.tgz

    Scala还引入了一些独特的语言特性,如特质(Traits)、隐式转换和case类,这些帮助开发者实现更简洁、更具表达力的代码。 10. 社区与文档: Scala有一个活跃的社区,提供了丰富的开源库和工具,以及详尽的官方...

    scala-intellij-bin-2019.1.9.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-intellij-bin-2019.1.9.zip"压缩包文件是为IntelliJ IDEA开发的一个Scala插件,适用于2019.1.x版本的IDEA集成开发环境。IntelliJ...

    scala-intellij-bin-2019.2.28.zip

    4. **面向对象编程**:Scala是面向对象的语言,支持类、对象和继承。同时,它引入了特质(trait)作为实现多继承和行为组合的方式。 5. ** Actors模型**:Scala集成了Akka库,提供了Actor模型来处理并发和分布式...

    scala-2.11.12.tgz

    4. **反射改进**:Scala 2.11增强了反射API,使得在运行时动态操作类和对象更加方便,这对构建元编程和动态系统非常有用。 5. **并行集合**:Scala的并行集合库在2.11版本中得到了优化,提供了更好的性能和可扩展性...

    scala-2.11 环境,免安装版,配置环境变量即可使用

    之后,用`scala`命令运行编译好的类。 Scala-2.11系列的改进包括对Java 8的更好支持、性能优化、新的类型系统特性,以及对Akka、Spark等框架的兼容性增强。例如,Scala 2.11引入了反射API的改进,使得在运行时检查...

    scala-intellij-bin-2019.1.2.zip

    代码重构是软件开发中的重要环节,Scala插件提供了诸如提取方法、重命名变量、移动类等重构操作,确保在修改代码结构时保持代码的整洁和可读性。同时,强大的调试工具允许开发者设置断点、查看变量值、步进执行,以...

    scala-intellij-bin-2017.3.11.zip

    - **代码补全**:提供丰富的代码提示,帮助快速输入Scala语法,包括类、方法、变量等。 - **语法高亮**:使代码更具可读性,不同的语法元素以不同颜色显示。 - **代码分析和错误检查**:在编码过程中实时检测潜在...

Global site tag (gtag.js) - Google Analytics