Scala Class etc.
Classes
- 一个源文件可包含多个类,每个类默认都是 public
- 类字段必须初始化,编译后默认是 private,自动生成 public 的 getter/setter ;Person 示例
private字段,生成 private 的 getter/setterval字段,只生成 getterprivate[this]字段,不生成 getter/setter- 自定义 getter/setter,foo 和 foo_=
- 类方法默认都是 public
- 方法调用规约:访问器调用可省略括号,修改器调用加上括号
- 为字段加上
@bean.BeanProperty注解可生成符合 JavaBean 规范的 get/set 方法(加上默认的两个方法,共四个方法) - 构造器:1 个主构造器,任意个辅构造器
- 全部都叫
this,只是参数不同 - 辅构造器必须调用主构造器或之前定义的辅构造器
- 主构造器与类定义密不可分,参数直接定义在类名后
- 主构造器会立即执行类定义中的所有语句
- 主构造器中的参数被方法使用到,则对应的参数等价于
private[this] val字段
- 全部都叫
- 内部类
- 路径依赖,不同于 Java 内部类,同一类 A 的不同实例(a1, a2)构建的内部类 Inner,其类型是不同的,a1.Inner != a2.Inner
- 解决路径依赖
- 类型投射,Outer#Inner
- 将内部类放到伴生对象 object 中
self =>自身类型,区分调用的内部类和外部类的字段、方法等
Objects
- 用于单例及工具类方法
- object 构造器只在第一次被调用时执行
- 可继承一个
class或多个trait- 可用于全局默认对象
- 不可提供构造器参数
- 伴生对象
- 与类名称一致
- 类与伴生对象可互相访问私有资源,但区分作用域,如
Accounts.newUniqueNumber()而不是newUniqueNumber() - 类与伴生对象必须在同一个源文件中
- 伴生对象中的
apply方法- 调用方式
Object(arg1, ..., argN), 返回伴生类的实例,如Array(1,2,3) - 省略
new关键字,在嵌套表达式中很方便
- 调用方式
- 应用对象
extends App- 不需要 main 方法直接执行构造器内的代码
- scala 默认无枚举类型
- 使用
Enumeration帮助类实现 - 枚举类型为
Enumeration.Value(ID, name)内部类, ID 依次累加, 默认 0 开始;name 默认是字段名
- 使用
Traits
- 替代 Java 中的接口
- 可以有抽象的和具体的方法
- 在
trait中未实现的方法默认是抽象的 (abstract)
- 在
- 类可以实现多个
trait,从最后一个开始调用- 使用
extends关键字实现 - 覆盖抽象方法时不需要
override关键字 - 有多个
trait则对其他的trait使用with关键字
- 使用
- 所有的 Java 接口都可以被当做
trait使用 - 对象也可以添加多个
trait,从最后一个开始调用 - 多个
trait的情况下,super.someMethod会根据从右向左的顺序调用下一个trait的方法- 具体调用依赖于使用时的顺序,相比传统的继承更灵活
- 在多个 mix-in 的情况下,如果父
trait存在抽象方法,则子trait需使用abstract override关键字,否则super.someMethod无法编译
- 有初始值的字段/具体字段,都会被添加到子类中
- 无初始值的字段/抽象字段,在非抽象子类中,需要进行初始化
trait也有构造器- 不可以有构造参数,且只有一个构造器
- 由定义体中的初始化字段和其他语句构成
- 构造顺序:父类 > 各
trait从左向右,有父trait的先构造,共享的父trait只构造一次 > 子类 - 考虑到构造顺序,如果子类中使用抽象字段,则可使用提前定义(early definition,会在构造器之前执行)的语法讲改字段初始化
- 提前定义语句块中只能使用字段定义语句,不可使用其他语句
trait可继承类,混入该trait的类都是被继承类的子类,子类如果有继承其他的类也必须是被继承类的子类- 与自身类型(self type)比较
trait不继承类,直接在 body 内定义this: Type =>,则混入的类必须是该 Type 类型的/子类型的- 也可使用结构类型(structural type),
this: { def log(msg: String) } =>,则混入的类必须包含结构类型中定义的方法
trait最终会翻译成类和接口
Packages and Imports
package包名和文件路径并不一定对应java.lang,scala,Predef始终默认会导入- 与 Java 不同,包路径并不是绝对的,如
collection.mutable实际是scala.collection.mutable package a.b.c与package a { package b { package c {}}}不同package a或package b中定义的资源可在带括号的包声明中访问,但package a.b.c无法访问
- 包对象
- package 由于 JVM 的限制不能直接声明函数或变量
- 不同于 package, package object 可定义工具函数或常量
- 可见性控制,通过
private[package.name]限制资源的可见性 import- 导入包后可使用相对路径访问类等,如
collection.mutable - 导入所有资源
import collection.mutable._ - 可在任意位置进行导入操作
selector- 选择性的导入一部分成员,
import java.awt.{Color, Font} - 为导入成员取别名:
import java.util.{HashMap => JavaMap} - 隐藏成员:
import java.util.{HashMap => _, _}// 避免产生混淆
- 选择性的导入一部分成员,
- 隐式导入,默认导入三个
java.lang,scala和Predef- 后面导入的可将前面的成员覆盖,避免冲突
- 导入 scala 相关的包可省略
scala路径
- 导入包后可使用相对路径访问类等,如
Inheritance
fragile base class基类被继承之后,修改基类可能会对子类造成无法预期的影响
- 继承类,与 Java 一样使用
extends关键字final类不能被继承,final字段、方法不能被覆盖
- 覆盖非抽象方法,必须使用
override关键字 - 抽象方法
- 无方法体的方法,可以省略
abstract关键字;子类覆盖时也可以省略override
- 无方法体的方法,可以省略
- 抽象字段
- 无初始值的字段,可省略
abstract关键字,子类覆盖式也可省略override
- 无初始值的字段,可省略
- 调用父类方法,使用
super关键字 - 类型检查和转换,
isInstanceOf,asInstanceOf;获取类型,classOf- 模式匹配通常是个更好的类型检查方式
protected不同于 Java,受保护成员在包内不可见- 辅助构造器不可直接调用超类构造器
- 可在定义类时直接在 extends 时调用超类构造器并传递参数
- 继承 Java 类时主构造器必须调用超类的构造器
- 覆盖字段
def只能覆盖defval只能覆盖 无参数的defvar只能覆盖 抽象的var
继承层级

Any定义了asInstanceOf,isInstanceOf,判断相等,hash值等方法AnyRef是除基础类型外所有类的父类,等价于java.lang.Object- 提供方法
wait,notify/notifyAll,synchronized
- 提供方法
AnyVal不包含任何方法,只是个值类型的标记- 所有 Scala 类都实现了
ScalaObject这个标记接口,该接口无任何方法 Null的唯一实例null,可分配给引用类型,但不可分配给值类型(Int不可为null)Nothing无实例,在泛型构造时有用,Nil类型为List[Nothing]???方法声明返回类型为Nothing, 无返回值,会抛出NotImplementedError,用于预留未实现的方法Unit代表空/void,类型唯一值为()- 如果方法参数类型为
Any或AnyRef, 当传递多个参数时,会被替换为tuple
equals和hashCode判断对象相等- 可使用模式匹配实现
equals equals参数类型为Any而不是具体的类型##是hashCode的安全版本,遇到null会返回 0 而不是抛出异常
- 可使用模式匹配实现
- 值类 Value Class
- 继承
AnyVal - 主构造器只有一个参数 val,无构造体
- 无其他构造器和字段
- 自动提供的
equals和hashCode比较实际值 - 用于隐式转换
- 其他用途,如
class a(x: Int, y: Int)设计为class a(x: X, y: Y),定义值类X,Y避免混淆参数
- 其他用途,如
- 继承
Scala Class etc.的更多相关文章
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
- Scala For Java的一些参考
变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...
随机推荐
- Python3 完美解决unittest框架下不生成测试报告
前提: 1.运行测试用例一切正常,只是没有测试报告显示 2.使用命令行pyhon 脚本名字.py 却可以生成测试报告 3.pycharm 在运行测试用例的时候 默认是以unittest 框架来运行的, ...
- Python笔记_类
1.类 1.1 类的定义 # 类的定义 class 类名: pass # pass是空语句,不具有任何意义,仅为了保持程序结构完整性 # 创建对象 对象名 = 类名() 1.2 成员变量 # 成员变量 ...
- 实战jmeter入门压测接口性能
什么是Jmeter? 是Apache组织开发的基于Java的压力测试工具. 准备工作: 一.安装配置好环境及压测工具 Jmeter下载地址:http://mirrors.tuna.tsinghua.e ...
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...
- Markdown写作入门
什么是Markdown格式 Markdown格式是一种可用普通文本编辑器编写的标记语言,使用者能够通过简单的标记语法,对自己所写文本内容进行简单的格式排版: 优点 语法简洁易学,且功能比纯文本强大: ...
- 【第一篇】spring boot 快速入门
1.开发环境 开发工具:IDEA2018.2.1 JDK:1.9 Maven : 3.3.9 操作系统:window 7 / window 10 2.项目结构 3.详细步骤 3.1 使用IDEA新建M ...
- Storm 系列(七)—— Storm 集成 Redis 详解
一.简介 Storm-Redis 提供了 Storm 与 Redis 的集成支持,你只需要引入对应的依赖即可使用: <dependency> <groupId>org.apac ...
- SpringCloud之Feign
[前面的话]书接上文,本文的某些知识依赖我的第一篇SpringCLoud的文章:SpringCloud之Eureka,如果没有看过可以先移步去看一下.另外在微服务架构中,业务都会被拆分成一个个独立的服 ...
- 《快照读、当前读和MVCC》
1.快照读 快照读是基于 MVCC 和 undo log 来实现的,适用于简单 select 语句,避免了幻读. 读已提交:一个事务内操作一条数据,可以查询到另一个已提交事务操作同一条数据的最新值.( ...
- 第8章 浏览器对象模型BOM 8.2 location对象
location 是最有用的 BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能.事实上, location 对象是很特别的一个对象,因为它既是 window 对象的属性, ...