Scala实践7
一、类
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的更多相关文章
- Scala实践14
1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...
- Scala实践13
1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...
- Scala实践12
1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...
- Scala实践11
1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...
- Scala实践10
1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...
- Scala实践9
1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...
- Scala实践6
1 if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...
- Scala实践8
1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...
- Scala实践5
一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...
随机推荐
- Spark1.6.1 MLlib 特征抽取和变换
Spark1.6.1 MLlib 特征抽取和变换 1 TF-IDF TF-IDF是一种特征向量化方法,这种方法多用于文本挖掘,通过算法可以反应出词在语料库中某个文档中的重要性.文档中词记为t,文档记为 ...
- Python--day65--模板语言之变量相关语法
Django的模板语言: 1.目前已经学过的模板语言: 2,模板语言总结: 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Codeforces Round #177 (Div. 1 + Div. 2)
A. Polo the Penguin and Segments 模拟. B. Polo the Penguin and Matrix 每个数字模d余数必须一样. 枚举结果,可计算操作次数,取最小. ...
- js 页面分享
首先说分享到QQ空间的通用代码:<a href="javascript:void(0);" onclick="window.open('http://sns.qzo ...
- h5&css3
HTML5 HTML5简介 万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改.作为新HTML语言,具有新的元素,属性和行为 它具有更大的技术集,允许更多样化和强 ...
- 消息驱动Bean
消息驱动bean是专门用来处理基于消息请求的组件.MDB负责处理消息,而EJB容器则负责处理服务(事务,安全,并发,消息确认等),使Bean的开发者集中精力在处理消息的业务逻辑上. 消息驱动Bean. ...
- 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 ...
- 2019前端学习路线心得-黑马程序员pink老师
在规划之前先给大家分享几点心得哈: 1. 学习,特别是在线学习,是非常辛苦的事情,为了少走弯路, 所以一定要系统学习,多借鉴与前辈们总结出来的经验. 2. 不要相信任何说 一周掌握 css, 一周学完 ...
- Qt4与Qt3的主要不同
Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...