scala学习笔记-类

来源:互联网 发布:装饰装修设计软件 编辑:程序博客网 时间:2024/05/22 02:10

1. 简单类和无参方法

scala类最简单的形式与Java类似:

class Counter{

private var value=0  //必须初始化字段

def increment(){ value+=1}  //方法默认是公有的

def current() =value

}

在scala中,类并不声明为public。scala源文件可以包含多个类,所有类都具有公有可见性

使用该类需要做的就是构造对象并按照通常的方式来调用方法:

val myCounter =new Counter  //或者 new Counter()

myCounter.increment()

println(myCounter.current)

调用无参方法时,可以写上圆括号,也可以不写。一般对于改值器方法(即改变对象状态的方法)使用(),对于取值器方法(不会改变对象状态的方法)去掉()

2. 带getter和setter的属性

scala对每个字段都提供getter和setter方法。例如:

class Person{

val age=0

}

scala生成面向JVM的类,其中有一个私有的age字段以及相应的getter和setter方法。这两个方法是公有的,因为我们没有将age声明为private。(对私有字段而言,getter和setter方法也是私有的。)

在scala中,getter和setter分别叫做age 和  age_=。 例如:

println(fred.age)  //将调用方法 fred.age()

fred.age  = 21

也可以重新定义getter和setter方法。例如:

class Person{

private var privateAge=0

def age=privateAge

def age_=(newValue: Int) {

if(newValue>privateAge)  privateAge = newValue

}

}

如果字段是私有的,则getter 和setter 方法也是私有的

如果字段是val,则只有getter方法被生成

如果你不需要任何getter或setter,可以将字段声明为private[this]

3. 只带getter的属性

如果属性的值在对象构建完成后就不再改变,则可以使用val 字段

scala会生成一个私有的final字段和一个getter方法,但没有setter

实现属性的四中方法:

var  foo  : Scala 自动合成一个getter 和setter

val  foo  : Scala 自动合成一个getter

由你来定义foo 和  foo_=方法

由你来定义 foo 方法

 4. 对象私有字段

scala中,方法可以访问该类的所有对象的私有字段。例如:

class Counter{

private var value =0

def  increment()  { value +=1 }

def isLess ( other :Counter) =value <other.value   

}

之所以访问other.value 是合法的,是因为other 也同样是 Counter 对象

scala 允许定义更加严格的访问限制,通过private[this]这个修饰符来实现对象私有

 private [this] var value =0  //类似某个对象 . value这样的访问将不被允许

对于类私有的字段,scala 生成私有的getter 和setter 方法。但是对于 对象私有的字段, scala根本不会生成 getter 或者 setter 方法

5. Bean 属性

当你将scala字段标注为 @BeanProperty时,这样的方法会自动生成。例如:

import scala.reflect.BeanProperty

class Person{

@BeanProperty var name:String=_

}

将会生成四个方法:

1) name:String

2) name_=(newValue:String):Unit

3) getName():String

4) setName(newValue:String):Unit

6. 辅助构造器

scala可以有任意多个构造器,一个主构造器和任意多个辅助构造器

辅助构造器的名称为this;每个辅助构造器必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始

7. 主构造器

在scala中,每个类都有主构造器。主构造器并不以this方法定义,而是与类定义交织在一起

1) 主构造器的参数直接放置在类名之后

calss Person( val name: String, val age : Int) {

  //(....) 中的内容就是主构造器的参数

...}

2) 主构造器会执行类定义中的所有语句。例如:

class Person( val name:String, val age : Int) {

 println(" Just  anoter person")

def desciption = name + " is "+ age + "years old" 

}

println 语句是主构造器的一部分。每当有对象被构造出来时,上述代码就会被执行。

8. 嵌套类

scala中可以在函数中定义函数,在类中定义类





原创粉丝点击