scala编程(四)——类和对象
类,字段和方法
在scala里定义一个典型的类,代码如下:
class ChecksumAccumulator {
private var sum = 0
def add(b: Byte): Unit = {
sum += b
}
def checksum(): Int = {
return ~(sum & 0xFF) + 1
}
}
1.在 Scala 里成员公开的方法是不显式地指定任何访问修饰符。换句话说,你在 Java 里要写上 “public”的地方,在 Scala 里只要什么都不要写就成。Public 是 Scala 的缺省访问级别。
2.Scala里方法参数的一个重要特征是它们都是val,不是var。如果你想在方法里面给参数重新赋值,结果是编译失败:
def add(b: Byte): Unit = {
// b += 1
sum += b
}
3.如果没有发现任何显式的返回语句,Scala 方法将返回方法中最后一个计算得到的值。假如某个方法仅计算单个结果表达式,则可以去掉大括号。如果结果表达式很短,甚至可 以把它放在 def 同一行里。
所以上面的checksum方法可以改写如下:
def checksum(): Int = ~(sum & 0xFF) + 1
4.当你去掉方法体前面的等号时,它的结果类型将注定是 Unit。 不论方法体里面包含什么都不例外,因为 Scala 编译器可以把任何类型转换为 Unit。另外,如果方法的最后结果是 String,但方法的结果类型被声明为 Unit,那么 String也将被转变为Unit 并失去它的值。
def checksum3():Unit = "hello";
Singleton对象
Scala 比 Java 更面向对象的一个方面是 Scala 没有静态成员。替代品是,Scala 有单例对象:singleton object
创建ChecksumAccumulator类的“伴生对象”:
// 文件 ChecksumAccumulator.scala
import scala.collection.mutable.Map
object ChecksumAccumulator {
private val cache = Map[String, Int]()
def calculate(s: String): Int =
if (cache.contains(s))
cache(s)
else {
val acc = new ChecksumAccumulator
for (c <- s)
acc.add(c.toByte)
val cs = acc.checksum()
cache += (s -> cs)
cs
}
}
表中的单例对象被叫做 ChecksumAccumulator,与前一个例子里的类同名。当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在 同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。
单例对象扩展了超类并可以混入特质。由于每个单例对象都是超类的实例并混入了特质,你可以通过这些类型调用它的方法,用这些类型的变量指代它,并把它传递给需要这些类型的方法。
类和单例对象间的一个差别是,单例对象不带参数,而类可以。因此你不能用new关键字实例化一个单例对象,你没机会传递给它参数。每个单例对象都被作为由一个静态变量指向的虚构类:synthetic class的一个实例来实现,因此它们与Java静态类有着相同的初始 化语法。4 4.4 Scala 程序特别要指出的是,单例对象会在第一次被访问的时候初始化。
不与伴生类共享名称的单例对象被称为孤立对象:standalone object。由于很多种原因你会用到它,包括把相关的功能方法收集在一起,或定义一个 Scala 应用的入口点。
Scala 程序
要执行 Scala 程序,你一定要提供一个有 main 方法(仅带一个参数,Array[String],且结果类型为 Unit)的孤立单例对象名。任何拥有合适签名的 main 方法的单例对象都可以 用来作为程序的入口点。
注意 Scala 隐式引用了包 java.lang 和 scala 的成员,和名为 Predef 的单例对象的成员,到每个 Scala 源文件中。Predef被放置在包 scala 中,包含了许多有用的方法。例如,当在 Scala 源文件中写 pringln 的时候,你实际调用了 Predef 的 println。(Predef.pringln 运转并调用 Console.println,做实际的工 作。)当你写 assert,你是在调用 Predef.assert。
接下来,我们在main方法中完成对上述ChecksumAccumulator类和单列对象的调用,代码如下:
import ChecksumAccumulator.calculate
object Summer {
def main(args: Array[String]) {
val args2 = List("hello","hi");
for (arg <- args2)
println(arg + ": " + calculate(arg))
}
}
程序的运行结果如下:
hello: -20
hi: -209
scala编程(四)——类和对象的更多相关文章
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
- day24:面向对象设计与面向对象编程、类和对象
一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...
- java面向对象编程(类、对象)
一.面向对象编程概述面向对象编程(Object Oriented Programming,缩写为OOP)是当今最流行的程序设计技术,它具有代码易于维护.可扩展性好和代码可常用等优点.面向对象的设计 ...
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...
- Scala中的类和对象
类的定义 使用class定义 类的字段 在类中使用var,val定义字段 类的方法 scala中,使用var定义字段默认提供setter和getter方法对应名称为 value_= 和value /* ...
- scala学习笔记——类和对象
基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...
- Scala编程入门---面向对象编程之对象
对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...
- java面向对象编程(一)-类与对象
1.问题的提出 张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小 ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- ES6学习笔记(一):轻松搞懂面向对象编程、类和对象
目录 面向过程编程P OP(Process oriented programming) 面向对象编程OOP(Object Oriented Programming) 总结 @ 面向过程编程P OP(P ...
随机推荐
- Linux高性能服务器编程:高性能服务器程序框架
服务器有三个主要模块: (1)I/O处理单元 (2)逻辑单元 (3)存储单元 1.服务器模型 C/S模型 逻辑:服务器启动后,首先创建一个或多个监听socket,并调用bind函数将其绑定到服务器感兴 ...
- c++ 获取GMT 时间和字符串
需要跨平台,所以可选的只有std 和 boost: boost 比较复杂了 #include <boost/date_time/local_time/local_time.hpp> std ...
- 吴裕雄--天生自然ShellX学习笔记:Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出.命令格式: echo string 您可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo ...
- 求素数的一个快速算法 Python 快速输出素数算法
思想 以100以内为例. 生成一个全是True的101大小的数组 2开始,遇到2的倍数(4,6,8,10...)都赋值为False 因为这些数字都有因子 2 3开始,遇到3的倍数(6,9,12...) ...
- ZJNU 1269 - 灯塔——高级
根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把 ...
- Dinic学习笔记
网络流是啥不用我说了吧 增广路定理不用我说了吧 Dinic就是分层然后只在层间转移,然后就特别快,\[O(N^2M)\] 伪代码: function dinic int flow = 0 ; whil ...
- 浅谈那些你不知道的C艹语法
C艹实践中的超神语法 pragma 卡常必备QAQ #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(" ...
- JetBrains Phpstorm 、 PyCharm 2019 最新破解码亲测可用
Phpstorm 2019 破解码最新亲测可用 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHc ...
- Django整体架构
Django整体架构 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了 用户能够访问到的所有的资源 都是程序员提前暴露好的, 如果没有暴露 用户就永远访问不了 一 ...
- abstract关键字、final关键字、static关键字、访问修饰符详解
abstract关键字.final关键字.static关键字.访问修饰符详解 abstract关键字: final关键字: static关键字: 访问修饰符: