一、类

1.1简单类和无参方法

  • 类的定义通过class关键字实现
  1. scala> class Dog {
  2. | private var leg = 4
  3. | def shout(content: String) {
  4. | println(content)
  5. | }
  6. | def currentLeg = leg
  7. | }
  8. defined class Dog
  9.  
  10. scala> val dog = new Dog
  11. dog: Dog = Dog@1d66664f
  12.  
  13. scala> dog shout "汪汪汪"
  14. 汪汪汪
  15.  
  16. scala> println(dog currentLeg)
  17. <console>:14: warning: postfix operator currentLeg should be enabled
  18. by making the implicit value scala.language.postfixOps visible.
  19. This can be achieved by adding the import clause 'import scala.language.postfixOps'
  20. or by setting the compiler option -language:postfixOps.
  21. See the Scaladoc for value scala.language.postfixOps for a discussion
  22. why the feature should be explicitly enabled.
  23. println(dog currentLeg)
  24. ^
  25. 4

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

1.2 getter和setter方法

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

  • 自己定义getter和setter方法
  1. class Dog2 {
  2. private var _leg = 4
  3. def leg = _leg
  4. def leg_=(newLeg: Int) {
  5. _leg = newLeg
  6. }
  7. }
  8.  
  9. scala> val dog2 = new Dog2
  10. dog2: Dog2 = Dog2@1b406bc2
  11.  
  12. scala> dog2.leg_=(10)//setter
  13.  
  14. scala> println(dog2.leg)
  15. 10
  16.  
  17. scala> dog2.leg_=(15)
  18.  
  19. scala> println(dog2.leg)
  20. 15

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

1.3Bean属性

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

  • 将Scala字段加@BeanProperty时,这样的方法会自动生成。
  1. import scala.beans.BeanProperty
  2. class Person {
  3. @BeanProperty var name: String = _ //添加@BeanProperty
  4. }
  5.  
  6. scala> val person = new Person
  7. person: Person = Person@6431e18
  8.  
  9. scala> person.setName("Nick")
  10.  
  11. scala> person.getName
  12. res15: String = Nick
  13.  
  14. scala> println(person.name)
  15. Nick 

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

1.4嵌套类

在class里面,再定义一个class

  • 模拟局域网内聊天的场景
  1. import scala.collection.mutable.ArrayBuffer
  2. class Network {
  3. class Member(val name: String) { //嵌套类
  4. val contacts = new ArrayBuffer[Member]
  5. }
  6. private val members = new ArrayBuffer[Member]
  7. def join(name: String) = {
  8. val m = new Member(name)
  9. members += m
  10. m
  11. }
  12. }
  • 使用该嵌套类
  1. scala> val chatter1 = new Network
  2. chatter1: Network = Network@4c372496
  3.  
  4. scala> val chatter2 = new Network
  5. chatter2: Network = Network@770f78cc
  6.  
  7. scala> val fred = chatter1.join("Fred")
  8. fred: chatter1.Member = Network$Member@2922bf92
  9.  
  10. scala> val wilma = chatter1.join("Wilma")
  11. wilma: chatter1.Member = Network$Member@79dcfb0d
  12.  
  13. scala> val barney = chatter2.join("Barney")
  14. barney: chatter2.Member = Network$Member@4b6be6fc
  15.  
  16. scala> fred.contacts += wilma
  17. res17: fred.contacts.type = ArrayBuffer(Network$Member@79dcfb0d)
  18.  
  19. scala> fred.contacts += barney//不再同一局域网,无法加好友
  20. <console>:17: error: type mismatch;
  21. found : chatter2.Member
  22. required: chatter1.Member
  23. fred.contacts += barney
  24. ^

1.5 伴生对象

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

  •  将member作为network的伴生对象
  1. scala> object Network2 {
  2. | class Member(val name: String) {
  3. | val contacts = new ArrayBuffer[Member]
  4. | def description = name + "的联系人:" +
  5. | (for (c <- contacts) yield c.name).mkString(" ")
  6. | }
  7. | }
  8. defined object Network2
  9.  
  10. scala> import scala.collection.mutable.ArrayBuffer
  11. import scala.collection.mutable.ArrayBuffer
  12.  
  13. scala> class Network2 {
  14. | private val members = new ArrayBuffer[Network2.Member]
  15. | def join(name: String) = {
  16. | val m = new Network2.Member(name)
  17. | members += m
  18. | m
  19. | }
  20. | def description = "该局域网中的联系人:" +
  21. | (for (m <- members) yield m.description).mkString(", ")
  22. | }
  23. defined class Network2
  24. warning: previously defined object Network2 is not a companion to class Network2.
  25. Companions must be defined together; you may wish to use :paste mode for this.
  26.  
  27. scala> val chatter3 = new Network2
  28. chatter3: Network2 = Network2@4a8b2ea0
  29.  
  30. scala> val chatter4 = new Network2
  31. chatter4: Network2 = Network2@1a79ce5
  32.  
  33. scala> val fred2 = chatter3.join("Fred")
  34. fred2: Network2.Member = Network2$Member@4aef70c4
  35.  
  36. scala> val wilma2 = chatter3.join("Wilma")
  37. wilma2: Network2.Member = Network2$Member@10d598ca
  38.  
  39. scala> val barney2 = chatter4.join("Barney")
  40. barney2: Network2.Member = Network2$Member@29238c0d
  41.  
  42. scala> fred2.contacts += wilma2
  43. res21: fred2.contacts.type = ArrayBuffer(Network2$Member@10d598ca)
  44.  
  45. scala> fred2.contacts += barney2
  46. res22: fred2.contacts.type = ArrayBuffer(Network2$Member@10d598ca, Network2$Member@29238c0d)
  47.  
  48. scala> println(chatter3.description)
  49. 该局域网中的联系人:Fred的联系人:Wilma Barney, Wilma的联系人:
  50.  
  51. scala> println(chatter4.description)
  52. 该局域网中的联系人:Barney的联系人:
  53.  
  54. scala> println(fred2.description)
  55. Fred的联系人:Wilma Barney
  56.  
  57. scala> println(wilma2.description)
  58. Wilma的联系人:
  59.  
  60. scala> println(barney2.description)
  61. Barney的联系人:

  

1.6类型投影

  • 在不同局域网添加联系人,还有一种方法是类型投影,注意关键符号”#“。
  1. import scala.collection.mutable.ArrayBuffer
  2. //投影
  3. class Network3 {
  4. class Member(val name: String) {
  5. val contacts = new ArrayBuffer[Network3#Member]
  6. }
  7. private val members = new ArrayBuffer[Member]
  8. def join(name: String) = {
  9. val m = new Member(name)
  10. members += m
  11. m
  12. }
  13. }
  14.  
  15. scala> val chatter5 = new Network3
  16. chatter5: Network3 = Network3@26627b56
  17.  
  18. scala> val chatter6 = new Network3
  19. chatter6: Network3 = Network3@35d80a2
  20.  
  21. scala> val fred3 = chatter5.join("Fred") //Fred 和 Wilma加入局域网1
  22. fred3: chatter5.Member = Network3$Member@3797459f
  23. scala> val wilma3 = chatter5.join("Wilma")
  24. wilma3: chatter5.Member = Network3$Member@1a30c741
  25.  
  26. scala> val barney3 = chatter6.join("Barney") //Barney加入局域网2
  27. barney3: chatter6.Member = Network3$Member@54b4191f
  28.  
  29. scala> fred3.contacts += wilma3
  30. res31: fred3.contacts.type = ArrayBuffer(Network3$Member@1a30c741)
  31. ^
  32. scala> fred3.contacts += barney3 //不同局域网添加联系
  33. 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. Spark1.6.1 MLlib 特征抽取和变换

    Spark1.6.1 MLlib 特征抽取和变换 1 TF-IDF TF-IDF是一种特征向量化方法,这种方法多用于文本挖掘,通过算法可以反应出词在语料库中某个文档中的重要性.文档中词记为t,文档记为 ...

  2. Python--day65--模板语言之变量相关语法

    Django的模板语言: 1.目前已经学过的模板语言: 2,模板语言总结: 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...

  3. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  4. Codeforces Round #177 (Div. 1 + Div. 2)

    A. Polo the Penguin and Segments 模拟. B. Polo the Penguin and Matrix 每个数字模d余数必须一样. 枚举结果,可计算操作次数,取最小. ...

  5. js 页面分享

    首先说分享到QQ空间的通用代码:<a href="javascript:void(0);" onclick="window.open('http://sns.qzo ...

  6. h5&css3

    HTML5 HTML5简介 万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改.作为新HTML语言,具有新的元素,属性和行为 它具有更大的技术集,允许更多样化和强 ...

  7. 消息驱动Bean

    消息驱动bean是专门用来处理基于消息请求的组件.MDB负责处理消息,而EJB容器则负责处理服务(事务,安全,并发,消息确认等),使Bean的开发者集中精力在处理消息的业务逻辑上. 消息驱动Bean. ...

  8. Vasya and a Tree CodeForces - 1076E (线段树 + dfs)

    题面 Vasya has a tree consisting of n vertices with root in vertex 1. At first all vertices has 0 writ ...

  9. 2019前端学习路线心得-黑马程序员pink老师

    在规划之前先给大家分享几点心得哈: 1. 学习,特别是在线学习,是非常辛苦的事情,为了少走弯路, 所以一定要系统学习,多借鉴与前辈们总结出来的经验. 2. 不要相信任何说 一周掌握 css, 一周学完 ...

  10. Qt4与Qt3的主要不同

    Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...