一、类

1.1简单类和无参方法

  • 类的定义通过class关键字实现
scala> class Dog {
| private var leg = 4
| def shout(content: String) {
| println(content)
| }
| def currentLeg = leg
| }
defined class Dog scala> val dog = new Dog
dog: Dog = Dog@1d66664f scala> dog shout "汪汪汪"
汪汪汪 scala> println(dog currentLeg)
<console>:14: warning: postfix operator currentLeg should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scaladoc for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
println(dog currentLeg)
^
4

  注:调用无参方法时,可以选择加或者不加(),如果方法定义没有加(),那么调用时就不能带括号。

1.2 getter和setter方法

Scala类中的每个属性,编译后,会有一个私有的字段和相应的getting、setting方法生成。

  • 自己定义getter和setter方法
class Dog2 {
private var _leg = 4
def leg = _leg
def leg_=(newLeg: Int) {
_leg = newLeg
}
} scala> val dog2 = new Dog2
dog2: Dog2 = Dog2@1b406bc2 scala> dog2.leg_=(10)//setter scala> println(dog2.leg)
10 scala> dog2.leg_=(15) scala> println(dog2.leg)
15

  注:自己手动创建变量的getter和setter方法需要遵循以下原则: 
      1) 字段属性名以“_”作为前缀,如:_leg 
      2) getter方法定义为:def leg = _leg 
      3) setter方法定义时,方法名为属性名去掉前缀,并加上后缀,后缀是:“leg_=”,如例子所示

1.3Bean属性

JavaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个命名习惯。为了Java的互操作性。

  • 将Scala字段加@BeanProperty时,这样的方法会自动生成。
import scala.beans.BeanProperty
class Person {
@BeanProperty var name: String = _ //添加@BeanProperty
} scala> val person = new Person
person: Person = Person@6431e18 scala> person.setName("Nick") scala> person.getName
res15: String = Nick scala> println(person.name)
Nick 

注:Person将会生成四个方法: 
1)name:String 
2)name_=(newValue:String): Unit 
3)getName():String 
4)setName(newValue:String):Unit

1.4嵌套类

在class里面,再定义一个class

  • 模拟局域网内聊天的场景
import scala.collection.mutable.ArrayBuffer
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
}
}
  • 使用该嵌套类
scala> val chatter1 = new Network
chatter1: Network = Network@4c372496 scala> val chatter2 = new Network
chatter2: Network = Network@770f78cc scala> val fred = chatter1.join("Fred")
fred: chatter1.Member = Network$Member@2922bf92 scala> val wilma = chatter1.join("Wilma")
wilma: chatter1.Member = Network$Member@79dcfb0d scala> val barney = chatter2.join("Barney")
barney: chatter2.Member = Network$Member@4b6be6fc scala> fred.contacts += wilma
res17: fred.contacts.type = ArrayBuffer(Network$Member@79dcfb0d) scala> fred.contacts += barney//不再同一局域网,无法加好友
<console>:17: error: type mismatch;
found : chatter2.Member
required: chatter1.Member
fred.contacts += barney
^

1.5 伴生对象

上个例子中,不同网络间无法添加联系人,要使的他们能够,则

  •  将member作为network的伴生对象
scala> object Network2 {
| class Member(val name: String) {
| val contacts = new ArrayBuffer[Member]
| def description = name + "的联系人:" +
| (for (c <- contacts) yield c.name).mkString(" ")
| }
| }
defined object Network2 scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> class Network2 {
| private val members = new ArrayBuffer[Network2.Member]
| def join(name: String) = {
| val m = new Network2.Member(name)
| members += m
| m
| }
| def description = "该局域网中的联系人:" +
| (for (m <- members) yield m.description).mkString(", ")
| }
defined class Network2
warning: previously defined object Network2 is not a companion to class Network2.
Companions must be defined together; you may wish to use :paste mode for this. scala> val chatter3 = new Network2
chatter3: Network2 = Network2@4a8b2ea0 scala> val chatter4 = new Network2
chatter4: Network2 = Network2@1a79ce5 scala> val fred2 = chatter3.join("Fred")
fred2: Network2.Member = Network2$Member@4aef70c4 scala> val wilma2 = chatter3.join("Wilma")
wilma2: Network2.Member = Network2$Member@10d598ca scala> val barney2 = chatter4.join("Barney")
barney2: Network2.Member = Network2$Member@29238c0d scala> fred2.contacts += wilma2
res21: fred2.contacts.type = ArrayBuffer(Network2$Member@10d598ca) scala> fred2.contacts += barney2
res22: fred2.contacts.type = ArrayBuffer(Network2$Member@10d598ca, Network2$Member@29238c0d) scala> println(chatter3.description)
该局域网中的联系人:Fred的联系人:Wilma Barney, Wilma的联系人: scala> println(chatter4.description)
该局域网中的联系人:Barney的联系人: scala> println(fred2.description)
Fred的联系人:Wilma Barney scala> println(wilma2.description)
Wilma的联系人: scala> println(barney2.description)
Barney的联系人:

  

1.6类型投影

  • 在不同局域网添加联系人,还有一种方法是类型投影,注意关键符号”#“。
import scala.collection.mutable.ArrayBuffer
//投影
class Network3 {
class Member(val name: String) {
val contacts = new ArrayBuffer[Network3#Member]
}
private val members = new ArrayBuffer[Member]
def join(name: String) = {
val m = new Member(name)
members += m
m
}
} scala> val chatter5 = new Network3
chatter5: Network3 = Network3@26627b56 scala> val chatter6 = new Network3
chatter6: Network3 = Network3@35d80a2 scala> val fred3 = chatter5.join("Fred") //Fred 和 Wilma加入局域网1
fred3: chatter5.Member = Network3$Member@3797459f
scala> val wilma3 = chatter5.join("Wilma")
wilma3: chatter5.Member = Network3$Member@1a30c741 scala> val barney3 = chatter6.join("Barney") //Barney加入局域网2
barney3: chatter6.Member = Network3$Member@54b4191f scala> fred3.contacts += wilma3
res31: fred3.contacts.type = ArrayBuffer(Network3$Member@1a30c741)
^
scala> fred3.contacts += barney3 //不同局域网添加联系
res37: fred3.contacts.type = ArrayBuffer(Network3$Member@1a30c741, Network3$Member@54b4191f)

  

Scala实践7的更多相关文章

  1. Scala实践14

    1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...

  2. Scala实践13

    1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...

  3. Scala实践12

    1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...

  4. Scala实践11

    1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...

  5. Scala实践10

    1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...

  6. Scala实践9

    1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...

  7. Scala实践6

    1  if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...

  8. Scala实践8

    1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...

  9. Scala实践5

    一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...

随机推荐

  1. 零基础入门--中文命名实体识别(BiLSTM+CRF模型,含代码)

    自己也是一个初学者,主要是总结一下最近的学习,大佬见笑. 中文分词说到命名实体抽取,先要了解一下基于字标注的中文分词.比如一句话 "我爱北京天安门”. 分词的结果可以是 “我/爱/北京/天安 ...

  2. servicemix-3.2.1 部署异常

    <jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message" version="1.0&q ...

  3. H3C 配置NAPT

  4. ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

    ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.You a ...

  5. python类中的双下划线方法

    __getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...

  6. Python--day37--多进程中的方法join()

    1,多进程中的方法join()的作用: 感知一个子进程的结束,将异步的程序改为同步 #join() import time from multiprocessing import Process de ...

  7. 记录vue创建项目过程

    已经学过无数次,但是每次都忘记,毕竟脑容量太小了,每次都需要翻看原来项目和视频再次学习,所以以此文字形式记录下来,方便于下次使用观看 1.打开git,找到创建vue的文件夹(已经安装好git的,然后在 ...

  8. CodeChef Ada Pawns

    最小割 留下最多的点 形如左上或者右上没有点的点一定会留下 对于斜着的关系的两个点不能共存 黑白行染色! 白行的点称为 白点,黑点类似 反着连关系 对于一定会留下的,S到白点,黑点到T,都连inf 不 ...

  9. JQ表单选择器和CSS3表单选择器

    JQ表单选择器和CSS3表单选择器 JQ表单选择器 为了使用户能够更加灵活地操作表单,jQuery中加入了表单选择器,利用这个选择器能极其方便的获取到表单的某个或者某类型的元素.表单选择器的介绍如图: ...

  10. C语言动态内存

    动态分配内存的概述 在数组一章中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需内存空间取决于实际输入的数据,而无法预先确定.为了解决上述问题,c ...