5.1类
class Counter {
private var value=0 //你必须初始化字段
def increment() {value+=1} //方法默认是公有的
def current()=value
在scala中,类并不声明为public。Scala源文件包含多个类,都是公有的
如何对类进行实例化
val myCounter=new Counter //或者使用new Counter()
调用无参方法时,你可以写上圆口号,也可以不写:
myCounter.current 或者myCounter.current()
一般情况,对于改值器使用(),二对于取值器,我们去掉()
比如 myCounter.increment() //这里对counter进行修改,所有我们使用了括号
myCounter.current //这里是查询当前值,去掉了口号
你可以通过以不带()的方式生命current来强制这种风格
Class Counter{
def current=value //定义中不带()
}
这样类的使用也必须不带括号
5.2带getter和setter的属性
class Person {
var age=0
}
在scala中,getter和seter分别叫做age和age_例如:
println(fred.age) //调用方法fred.age()
fred.age=22 //调用fred.age=(21)
在任何时候,我们可以自己重新定了setter和getter方法
注意:如果知道字段是是私有的,则getter和 setter也是私有的
如果字段是val,则只有getter方法
如果不需要任何的setter和getter,可以将字段声明为private[this]
有时你需要这样的情况,客户端不能改值,但可以通过其他的方式进行修改,如下就是比较好的例子
class Counter {
private var value=0 //你必须初始化字段
def increment() {value+=1} //方法默认是公有的
def current()=value
总结一下:在实现属性时你有如下4种选择:
1.var foo:Scala自动合成一个getter和setter
2.val foo:Scala自动合成一个getter
3.由你来自定义foo和foo_方法
4.由你来自定义foo方法
5.在scala中你不能只实现只写属性
5.4对象私有字段
在scala中,方法可以访问类中所有对象的私有字段
class Counter{
private var value=0
def increment() {value+=1}
def isLess(other:Couter)=value<other.value //可以访问另一个对象的私有字段
scala允许我们定义更加严格的访问限制,通过private[this]这个修饰来实现
private[this] var value=0 //类似某个对象.value这样的访问将被不允许。
这样一来,Count类的方法只能访问当前字段的values,而不能访问同样是Count类型的其它对象的该字段。scala根本也不会生成对应的setter和getter方法。
5.5Bean属性
因Scala自己定义的setter和getter方法,方法名不直观,采用@BeanProperty时,可以生成和java中定义的属性命名模式一样的方法,这样getFoo和setFoo的方法将自动生成。
import scala.reflect.BeanProperty
class Person{
@BeanProperty var name:String= _
}
将会生成四个方法:
1.name:String //scala自定义的
2.name_=(newVaule:String):Unit //scala自定义的
3.getName():String //java中定义的模式
4.setName(newVaule:String):Unit //java中定义的模式
书上55也可以查看针对定义的不同字段生成的方法
5.6辅助构造器
scala可以有任意多的构造器,一般分为主构造器和辅构造器
辅构造器的特点:
1.辅助构造器的名称为this
2.没一个辅助构造器都必须以一个对先前已定义的其它辅助构造器或主构造器调用开始
class Person {
private ar name=""
private var age=0
def this(name:String)
{
this() //调用主构造器
this.name=name
}
def this(name:String,age:Int)
{
this(name)//掉用前一个辅助构造器
this.age=age
}
构造对象的方式:‘
var p1=new Person //调用主构造器
var p2=new Persion("Fred") //调用第一辅助构造器
var p3=new Persion("Fred",42) //掉用第二个辅助构造器
5.7主构造器
在scala中每个类都有主构造器,主构造器并不以this方法定义,而是与类定义交织在一起
class Persion(val name:String,val age:Int){
...........
}
主构造器的参数被编译成字段,在本列中name和age成为类的字段
注意:主构造器执行类中定义的所有语句,如果类名之后没有任何参数,则该类具备一个无参构造器,这个构造器仅简单执行类体中所有语句。
提示:可以在主构造器中使用默认参数避免过多的使用辅助构造器
class Peson(val name:String="",val age :Int=0) { }
主构造器的参数可是任意形式,如下
class Person(val name:String,private var age:Int){}
如果不带val或者var的参数只是被一个方法使用,它将被升级为字段
书上62页定义了主构造器的参数定义类型与字段权限类型的定义。
总结:在scala中,类也接收参数,就像方法一样,这种方式就是主构造器的定义方法。