5.class 类
5.1 class 以及没有参数的方法
a: 一个scala 源文件 有可以有多个class,每个class 的访问属性都是public
b:类的使用: val name=new className
c:方法调用 name.methodName()
方法调用风格中要不要加(),
取决与如果只是访问这个对象并不改变这个对象中字段的值:则可以将()去掉
如果访问的方法将会改变对象中字段的值,则将()加上
例如:
val myCounter = new Counter // Or new Counter()
myCounter.increment()
println(myCounter.current)
d:如果在方法定义中没有加(),则方法调用 也不能加()
5.2 getter以及setter 属性
a:在类中 不加private 修饰符的 变量var ,访问属性为public .
例如: var age =0
b:scala 编译器 为var 变量提供get 和set 方法 ,只是方法的表现形式稍微不同,表现如下:
例如:
class Person {
var age = 0
}
对应的getter 方法为 age() ,对应的setter 方法为: age_=
通过对scala编译成的class 文件,用javap命令查看 为如下结果:
public class Person extends java.lang.Object implements scala.ScalaObject{
private int age;
public int age();
public void age_$eq(int);
public Person();
}
其中$eq 为=的转义符
c: get以及set 方法使用如下:
val fred = new Person
fred.age = 30
fred.age = 21
println(fred.age) // 30
d:如果是private var ,则scala 生成的getter 以及setter 方法是private
e:如果一个字段是val,则scala 只生成 getter 方法
f:如果要禁止scala编译器生成get以及 set,则将该变量定义成Private[this]
总结对象访问:
1:对于var foo ,scala 自动生成get以及set
2.对于val foo,scala 只是生成get
3.可以自己定义 foo foo_=
4.也可以定义一个foo
5.privat[this] foo,则不会生成get 以及set,
那么这个字段只能通过 类中自己定义的方法进行访问,而不能通过类对象直接访问
6:为字段加@BeanProperty,则在类中生成4个方法:
例如:
import scala.reflect.BeanProperty
class Person {
@BeanProperty var name: String = _
}
generates four public methods:
1. name: String
2. name_=(newValue: String): Unit
3. getName(): String
4. setName(newValue: String): Unit
class Person(@BeanProperty var name: String)
5.3 构造函数
a:主要构造函数
a:主要构造函数的参数不是通过this加以定义,是直接跟在类名后面classname
b:调用主要构造函数,则会执行类定义中的所有语句,
这个属性对于构造函数阶段初始化数据特别有用
c:主要构造函数的参数具有如下几个定义形式:
- name: String : 如果在一个以上的方法中使用到,则变成object-private 的字段,否则据不会变成类中的字段,
- private val/varname:String 变成 private 字段以及private的getter/setter方法
- val/var name: String :变成private field以及public getter/setter
- @BeanProperty val/varname: String 变成 private field, public Scala and JavaBeans getters/setters
b:辅助构造函数
b.1 通过this加以def
b.2 每个辅助构造函数 都是以调用上一个辅助构造函数或者主要构造函数开始
例如:
class Person {
private var name = ""
private var age = 0
def this(name: String) { // An auxiliary constructor
this() // Calls primary constructor
this.name = name
}
def this(name: String, age: Int) { // Another auxiliary constructor
this(name) // Calls previous auxiliary constructor
this.age = age
}
}
c:构造函数使用:
val p1 = new Person // Primary constructor
val p2 = new Person("Fred") // First auxiliary constructor
val p3 = new Person("Fred", 42) // Second auxiliary constructor
5.4 嵌套类
a:例如:
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members += m
m
}
}
内部类的生成方法: new chatter.Member
b: 静态内部类
object Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
}
class Network {
private val members = new ArrayBuffer[Network.Member]
...
}
或者
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Network#Member]
}
...
}
c:外部类引用别名使用
例如:
class Network(val name: String) { outer =>
class Member(val name: String) {
...
def description = name + " inside " + outer.name
}
}
outer => 生成一个变量值将外部类this,例如:Network.this.
6.Object
6.1 singleton 单例对象
a:sacla 中没有静态方法和静态常量。 如果需要为静态方法和静态常量提供工具类,则可以将静态方法和静态常量封装载object 中
b: 在sacla中的function 可以定义在object 中
c:单例对象的构造函数 只有在第一次调用方法时触发。此后不再触发。 如果该单例对象中的每个方法都没有被调用过,则该单例对象的构造函数不会被触发
6.2 companion object
a:为了表示一个类中既有静态方法也有非静态方法,则可以使用companion object.
b: companion object 必须和class 文件在同一个源文件中
c:companion object 对象的调用也是需要限定符号,例如:
class Account {
val id = Account.newUniqueNumber()
private var balance = 0.0
def deposit(amount: Double) { balance += amount }
...
}
object Account { // The companion object
private var lastNumber = 0
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
}
必须使用 Account.newUniqueNumber() 调用companion object 对象
6.3 object 继承class 或者traits
a:指定一个类的对象不仅继承了指定的class 和traits,而且还具有定义在object 中的所有特性
b:例如:
abstract class UndoableAction(val description: String) {
def undo(): Unit
def redo(): Unit
}
object DoNothingAction extends UndoableAction("Do nothing") {
override def undo() {}
override def redo() {}
}
val actions = Map("open" -> DoNothingAction, "save" -> DoNothingAction, ...)
6.4 apply 方法
a:object 具有apply方法,该方法的调用形式为: Object(arg1, ..., argN)
b:通常apply方法调用返回一个companion class 的object
c:例如:Array("Mary", "had", "a", "little", "lamb")
返回一个Array object
Array(100) :this.apply(100) 得到结果为Array[Int]
new Array(100): this(100) 得到结果为 100个类型为Nothing 的Null Element
class Account private (val id: Int, initialBalance: Double) {
private var balance = initialBalance
...
}
object Account { // The companion object
def apply(initialBalance: Double) =
new Account(newUniqueNumber(), initialBalance)
...
}
6.5 Application Objects
a: 继承App 类实现main方法
object Hello extends App {
println("Hello, World!")
}
object Hello extends App {
if (args.length > 0)
println("Hello, " + args(0))
else
println("Hello, World!")
}
6.6 Enumerations 枚举类型
a:scala 没有枚举类型,但是sacla 类库提供了 Enumerations Helper 类 用与产生Enum 枚举 类型
b:定义一个Object 继承 Enumerations
c:通过调用Value 方法初始化每个值
例如:
object TrafficLightColor extends Enumeration {
val Red, Yellow, Green = Value
}
上述方法相当与
val Red = Value
val Yellow = Value
val Green = Value
每个调用Value 返回一个内部类的新实例
val Red = Value(0, "Stop")
val Yellow = Value(10) // Name "Yellow"
val Green = Value("Go") // ID 11
Value 方法可以指定ID 和名字,如果不传ID ,则根据上次使用的ID +1
d:枚举类型使用
TrafficLightColor.Red,TrafficLightColor.Yellow
为Value 定义别名
object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red, Yellow, Green = Value
}
通过import 使用枚举类型
import TrafficLightColor._
def doWhat(color: TrafficLightColor) = {
if (color == Red) "stop"
else if (color == Yellow) "hurry up"
else "go"
}
e:输出枚举类型中的所有值
例如: for (c <- TrafficLightColor.values) println(c.id + ": " + c)
f:根据ID 或者 Name 输出枚举对象
例如:
TrafficLightColor(0) // Calls Enumeration.apply
TrafficLightColor.withName("Red")
都输出了 TrafficLightColor.Red 对象
分享到:
相关推荐
"Scala_day01_scala_" 的标题暗示了这是一份针对初学者的Scala学习资料,旨在帮助新接触者快速入门。下面,我们将深入探讨Scala的一些核心概念和特性。 首先,Scala的基础语法与Java类似,但它提供了更简洁的表达...
day. You won’t understand the zen of objects being functions and functions being objects in your first week. Each feature of the language is another light bulb waiting to switch on over your head. I...
一天之内的Scala ...然后你需要克隆 repo git clone https://github.com/gilt/scala-1-day.git 。 之后你应该可以去 000.setup 并运行sbt "run-main javax.HelloWorld"和sbt "run-main scalax.HelloWorld" 。
utils4s包含各种scala通用、好玩的工具库demo和使用文档,通过简单的代码演示和操作文档,各种库信手拈来。时间操作的示例代码:package cn.thinkjoy.utils4s.lamma import io.lamma._ /** * test * */ ...
华沙Scala光滑的一天 华沙 Scala 用户组聚会的项目框架。 通过更改application.conf文件中的设置,可以将应用程序配置为与数据库和服务的模拟实现一起运行。 建议在 sbt 中使用re-start命令运行应用程序并使用re-...
Apache Spark 是使用 Scala 编程语言编写的。为了支持 Apache Spark 和 Python 的协作,PySpark 被释放出来,实际上是一个 Python API 用于 Spark。PySpark 是一个 Python API,支持 Python 与 Apache Spark 的集成...
NewDay作为一家可能的公司,其数据工程师的招聘流程通常会涵盖对技术技能,尤其是编程语言如Scala的深入理解的评估。以下是对电影评分数据集和Scala在数据工程中的应用进行详细阐述: Scala是一种多范式编程语言,...
#Dallas Cassandra Day KafkaSparkCasandraDemo 为了运行此演示,假定您已安装以下组件,并且在本地系统上可用。 Datastax企业版4.8 Apache Kafka 0.8.2.2,我使用了Scala 2.10构建吉特sbt ## Kafka入门请使用以下...
在IDEA中编写Spark程序,需要先配置Maven仓库,安装Scala环境,然后创建Maven项目并安装Scala插件。在pom.xml中添加Spark的相关依赖,如`spark-core_2.11`。创建SparkContext时,通过SparkConf设置配置信息,如...
5. **易部署和扩展**:Spark可以运行在多种集群管理器之上,如Mesos、YARN或独立部署,同时支持多种编程语言,如Java、Scala、Python和R,易于集成现有系统。 6. **机器学习和人工智能**:随着大数据与AI的结合日益...
- 如 `src/test/scala/day01/Day01Test.scala` 包含针对Day01问题的单元测试。 3. **input** - 包含每个问题的输入数据,通常为文本文件。 - 文件名可能与问题编号对应,例如 `input/day01.txt`。 4. **output** -...
Scala Perl CC#Excel MS Access JSON图形映射NLP自然语言处理机器学习igraph DOSUBL DOW循环stackoverflow SAS社区。 90天滚动标准偏差的标准偏差 WPS/Proc R 10 million readings is a tiny amount of data. Are ...
Python - 100天从新手到大师 ...数据分析挖掘 - Python / R / Scala / Matlab 机器学习 - Python / R / Java / Lisp 作为一名Python开发者,主要的就业领域包括: Python服务器后台开发 / 游戏服务器开
Software engineers and architects will learn patterns that address day-to-day distributed development problems in a fault-tolerant and scalable way. Project leaders and CTOs will gain a deeper ...
3. **集合库**:Scala的集合库提供了丰富的数据结构和操作,如List、Set、Map等,以及各种转换和聚合操作。这些工具在处理AOC中的数据操作时非常有用,能够快速实现对大量数据的分析和计算。 4. **Case类与Case对象...
Scala / Matlab 机器学习 - Python / R / Java / Lisp 作为一名Python开发者,主要的就业领域包括: Python服务器后台开发 / 游戏服务器开发 / 数据接口开发工程师 Python自动化运维工程师 Python数据分析 / 数据...
1. **日期时间模型**:库可能定义了自己的日期时间模型,如`YearMonthDay`、`LocalTime`等,这些模型可能比Java 8的`java.time`包更加轻量级和易于使用。 2. **解析和格式化**:提供解析字符串到日期时间对象以及将...
English | 26 July 2017 | ISBN: 1786462745 | ASIN: B01MR4YF5G | 354 Pages | AZW3 | 13.74 MB Advanced analytics on your Big Data with latest Apache Spark 2.x About This Book An advanced guide with a ...
Scala / Matlab 机器学习 - Python / R / Java / Lisp 作为一名Python开发者,主要的就业领域包括: Python服务器后台开发 / 游戏服务器开发 / 数据接口开发工程师 Python自动化运维工程师 Python数据分析 / 数据...