一、类

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. 2018-8-10-win10-sdk-是否向下兼容

    title author date CreateTime categories win10 sdk 是否向下兼容 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 ...

  2. mac默认截图、截图代码

    苹果系统自带截图功能   1 截取全屏:快捷键(Shift+Command+3) 直接按“Shift+Command+3“快捷键组合,即可截取电脑全屏,图片自动保存在桌面. 2 截图窗口:快捷键(Sh ...

  3. java 使用反射操作字段

    Field提供两组方法操作字段: xxx getXxx(Object obj):获取obj对象该Field的字段值,此处的xxx表示8个基本数据类型.若该字段的类型是引用数据类型则使用,Object ...

  4. P1011 圆柱体的表面积

    题目描述 输入底面半径 \(r\) 和高 \(h\) ,输出圆柱体的表面积,保留 \(3\) 位小数. 输入格式 输入包含两个实数 \(r,h(1 \le r,h \le 1000)\) 且保证输入的 ...

  5. Jmeter 发送json

    阅读更多 使用jmeter发送json数据.方法有三种 原创,转载请注明出处 1.利用CSV Data set Config. 参考: http://demi-panda.com/2013/01/08 ...

  6. rabbitmq template发送的消息中,Date类型字段比当前时间晚了8小时

    前言 前一阵开发过程遇到的问题,用的rabbitmq template发送消息,消息body里的时间是比当前时间少了8小时的,这种一看就是时区问题了. 就说说为什么出现吧. 之前的配置是这样的: @B ...

  7. 洛谷——P1305 新二叉树(新建二叉树以及遍历)

    题目描述输入一串二叉树,用遍历前序打出. 输入输出格式输入格式: 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...

  8. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  9. 小心Powershell的位数

    我们都知道64位的 Windows 中有两个Powershell,32位的 Windows Powershell(x86)和64位的 Windows Powershell.(当然,32位的Window ...

  10. ssh 简写

    << remotessh remotessh 这一对之间,可以写多个命令,换行即可. 否者就简单的 双引号,里面每个命令用分号隔开. 注意: 在远程服务器上的执行权限. 注意:login密 ...