首页 > 代码库 > Scala类
Scala类
要点
- 类中的字段自动带有getter方法和setter方法
- 可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户端----这就是“统一访问原则”
- 用@BeanProperty注解来生成JavaBeans的getXxx/setXxx方法
- 每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。它的参数直接成为类的字段,主构造器执行类体中所有的语句。
- 辅助构造器是可选的,它们叫做this
在Scala源文件中,可以包含多个类,所有这些类都具有共有可见性。
Scala对每个字段都提供setter和getter方法,比如class Person{var age = 0},Scala生成面向JVM的类,其中有一个私有的age字段以及相应的getter和setter方法,这两个方法是公有的,如果age是私有的,那么相应的getter和setter也是私有的,在Scala中,getter和setter分别叫做age和age_=。默认的getter和setter是由Scala自动生成,但是你也可以手动生成,例如:
class Person { private var privateAge = 0 def age = privateAge def age_=(newAge: Int) { if (newAge > privateAge) privateAge = newAge } } object HelloWorld { def main(args: Array[String]) { var p = new Person() p.age = 11 p.age_=(1) //设置age的值,但是该调用其实相当于调用setter方法,在setter方法中有控制语句,所以该句话不起作用 println(p.age) //取出age的值,相当于getter方法 } } |
统一访问原则
由Eiffel语言的发明者Bertrand Meyer提出,内容是“某个模块提供的所有服务都应该能通过统一的表示法访问到,至于它们是通过存储还是通过计算来实现的,从访问方式上应无从获知”。
Scala对setter和getter的控制
- 如果字段是私有的,则getter和setter方法也是私有的
- 如果字段是val,则只有getter方法被生成
- 如果你不需要任何getter和setter,可以将字段声明为private[this]
总结,在实现属性时有如下四种选择:
- var foo:Scala自动合成一个getter和setter
- val foo:Scala自动合成getter
- 由你来定义foo和foo_=方法
- 由你来定义foo方法
对象私有字段
private [this] var value = http://www.mamicode.com/0//类似于某个对象.value这样的访问将不被允许
这时候,value就是对象私有的,其他同一个类的对象也无法访问到,对象私有的字段,Scala不会生成getter或setter方法。
Bean属性
如果你将Scala对象标注为@BeanProperty时,例如:@BeanProperty var name : String = _
将会生成四个方法:
1. name:String
2. name_=(newValue:String):Unit
3. getName():String
4. setName(newValue:String):Unit
构造器
Scala类有一个构造器比其他所有构造器都更为重要,它就是主构造器,除了主构造器之外,类还有任意多的辅助构造器,辅助构造器的特点如下:
1. 辅助构造器的名称为this
2. 每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始
在Scala中,如果没有显式定义主构造器,则自动拥有一个无参的主构造器,主构造器并不以this方法定义,而是与类定义交织在一起。
主构造器的参数直接放置在类名之后
class Person(val name: String, val age: Int) { //(...)中的内容就是主构造器中的内容 } |
如果类名之后没有参数,则该类具备一个无参主构造器。这样一个构造器仅仅是简单地执行类体中的所有语句而已。
主构造器参数 | 生成的字段/方法 |
name:String | 对象私有字段 |
private val/var name:String | 私有字段,私有的getter/setter方法 |
val/var name:String | 私有字段,公有的getter/setter方法 |
@BeanProperty val/var name:String | 私有字段,公有的Scala版和JavaBean版getter/setter方法 |
class Person private (val id : Int){...};这样用户就必须通过辅助构造器来构造Person对象
嵌套类
在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构,你可以在函数中定义函数,在类中定义类。要构造一个新的内部对象,只需要简单的new这个类名:new 外部类.内部类。在内嵌类中,你可以通过外部类.this的方式来访问外部类的this引用,还可以用如下语法建立一个指向该引用的别名
class NetWork(val name: String) { outer => class Member(val name: String) { ... def description = name + " inside " + outer.name } } |
class NetWork{outer=>语法使得outer变量指向NetWork.this。对这个变量,可以使用任何合法的名称。}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。