Scala之类和对象
来源:互联网 发布:存货管理的数据 编辑:程序博客网 时间:2024/06/05 18:51
1、Public是Scala的默认访问级别
在Scala里把成员公开的方法是不显式的指定任何访问修饰符。换句话说,在Java里要写上“public”的地方,在Scala里只要什么都不要写就成。Public是Scala的默认访问级别。
2、分号推断的规则
除非一下情况的一种成立,否则行尾被认为是一个分号:
1. 疑问行由一个不能合法作为语句结尾的字结束,如句点或中缀操作符;
2. 下一行开始于不能作为语句开始的词;
3. 行结束于括号(…)或方框[…]内部,因为这些符号不可能容纳多个语句。
3、Singleton对象
Scala比Java更为面向对象的特点之一是Scala不能定义静态成员,而是代之以定义单利对象(singleton object)。除了用object关键字替换了class关键字意外,单例对象的定义看上去与类定义一致。
packagecom.turing.program.collectionimportscala.collection.mutable.Map objectChecksumAccumulator { private val cache = Map[String,Int]() def calculate(s:String): Int = { if (cache.contains(s)) { cache(s) } else { val acc = newChecksumAccumulator for(c <- s) acc.add(c.toByte) val cs = acc.checksum() cache += (s-> cs) cs } } classChecksumAccumulator{ private var sum = 0 def add(b: Byte):Unit = sum += b def checksum(): Int= ~(sum & 0xFF) + 1 }}
当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象(companion object)。类和它的伴生对象必须定义在一个源文件里。类被称为是这个单例对象的伴生类(companion class).类和它的伴生对象可以互相访问其私有成员。
类和单例对象间的差别是,单例对象不带参数,而类可以。因为单例对象不是用new关键字实例化的,所以没机会传递给它实例化参数。每个单例对象都被实现为虚构类(synthetic class)的实例,并指向静态的变量,因此它们与Java静态类有着相同的初始化语义。特别要指出的是,单例对象在第一次被访问的时候才会被初始化。
不与伴生类共享名称的单例对象被称为独立对象(standalone object)。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义Scala应用的入口点。
4、Scala程序
Scala的每个源文件都隐含了对包java.lang、包scala,以及单例对象Predef的成员引用。包scala中的Predef对象包含了许多有用的方法。例如,Scala源文件中写下println语句,实际调用的是Predef的println(Predef.println转而调用Console.println,完成真正的工作)。写下assert,实际是在调用Predef.assert。
5、Application特质
packagecom.turing.program.collectionimportcom.turing.program.collection.ChecksumAccumulator.calculate objectFallWinterSpringSummer extends App{ for(season <- List("fall", "winter", "spring")) { println(season + ": " + calculate(season)) }}
使用“extends App”,代之以main方法,可以把想要执行的代码直接放在单例对象的花括号之间。如此而已,之后可以正常的编译和运行。
能这么做,是因为特质Application声明了带有合适签名的main方法,并被单例对象继承,使它可以像Scala程序那样。花括号之间的代码被收集进了单例对象的主构造器(primaryconstructor),并在类被初始化时执行。
继承自Application比编写完整的main方法要方便,不过也有缺点。首先,如果想访问命令行参数的话就不能用它,因为args数组不可访问。比如,因为Summer程序使用了命令行参数,所以它必须编写完整的main方法。第二,因为某些JVM线程模型里的局限,如对于多线程的程序需要自行编写main方法;最后,某些JVM的实现没有优化被Application特质执行的对象的初始化代码。因此只有当程序相对简单并且是单线程的情况下才可以继承Application特质。
- Scala之类和对象
- scala学习之类和对象
- scala基础之类和对象
- 从零开始学Scala系列(六)之类(Classes)和对象(Objects)
- 从零开始学Scala系列(六)之类(Classes)和对象(Objects)
- Scala学习—面向对象编程之类
- Scala 之类与对象(五)
- java之类和对象
- c++之类和对象
- JAVA之类和对象
- C++之类和对象
- Kotlin之类和对象
- Kotlin之类和对象
- C++之类和对象
- scala之类
- 面向对象之类和对象
- 面向对象之类和对象
- IOS开发之类和对象
- PEP8 Python编码规范
- 排序六之快速排序
- java数据库编程——执行查询操作(二)
- IOS-OC之高级组件PickerView之二
- Caffe model解析
- Scala之类和对象
- VB.NET中类对象
- NLP系列(3)_用朴素贝叶斯进行文本分类(下)
- 第十五章 单点登录——《跟我学Shiro》
- 模板编译模型
- android系统源码学习 -- 蓝牙 bluetooth (一) 入门
- 数位拆解 1
- System.Web.HttpRequestValidationException检测到有潜在危险的 Request.Form 值
- BZOJ 4321: queue2|动态规划