要点:
1·类中的字段自动带有getter方法和setter方法。
2·你可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户 端一一这就是所谓的“统一访问原则” 。
3 ·用@BeanProperty注解来生成JavaBeans的getXxx/setXxx方法。
4·每个类都有一个主要的构造器,这个构造器和类定义“交织”在一起。 它的参 数直接成为类的字段。 主构造器执行类体中所有的语句。
5 ·辅助构造器是可选的。 它们叫作this。
定义类
cl ass Counter {
private var value= 0//你必须初始化字段
def increment() { value+= 1 }// 方法默认是公有的
def current() =value
}
调用无参方法(比如current ) 时,你可以写上圆括号, 也可以不写:
应该用哪一种形式呢?我们认为对于改值器方法(即改变对象状态的方法 ) 使 用(),而对于取值器方法(不会改变对象状态的方法)去掉()是不错的风格。 这也是我们在示例中的做法:
myCounter. increment (} //对改位器使用()
println(myCounter.curr ent) //对取值器不使用()
set get
Scala对每个字段生成getter和sette「方法昕上去有些恐怖。不过你可以 控制这个过程。
· 如果字段是私有的,则getter 和setter方法也是私有的。
. 如果字段是时,则只有getter方法被生成。
· 如果你不需要任何getter或setter, 可以将字段声明为private[this]
Bean属性
class Person (
@BeanProperty var name: String = _
}
将会生成四个方法:
1 . name: String
2 .name =(newValue : String): Unit
3 . getName(): String
- setName(newValue : String) : Unit
辅助构造器
- 辅助构造器的名称为this。 (在Java或C++中,构造器的名称和类名相同一一 当你修改类名时就不那么方便了。)
- 每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的 调用开始。
class Person {
private var name = ””
private var age = 0
def this(name: String) { //一个辅助构造器
this() // 调用主构造~
this.name = name
}
def this(name : String, age: Int) {//另一个辅助构造器
this(name) // 调用前一个辅助构造器
this.age = age
}
}
主构造器
在Scala中,每个类都有主构造器。主构造器并不以this方法定义,而是与类定义 交织在一起
主构造器的参数直接放置在类名之后。
class Person(val name: String, val age: Int) (
//(...)中的内容就是主构造器的参数
}
主构造器会执行类定义中的所有语句。
当你需要在构造过程中配置某个字段时,这个特性特别有用。 例如:
class MyProg {
private val props = new Properties
props.load(new FileReader (” myprog.properties”)) //上述语句是主构造器的一部分
...
}
主构造器的参数可以采用表5-1中列出的任意形态。
class Person(val name: String, private var age: Int)
这段代码将声明并初始化如下字段:
val name: String
private var age: Int
构造参数也可以是普通的方法参数,不带val或var。这样的参数如何处理取决于 它们在类中如何被使用。
如果不带val或var的参数至少被一个方法所使用,它将被升格为字段。
class Person (name: String, age: Int) {
def description = name + ” is ” + age + ” year.s old”
}
上述代码声明并初始化了不可变字段name和age,而这两个字段都是对象私有的。
类似于这样的字段等同于 private[this) val 字段的效果
Scala设计者们认为每敲一个键都是珍贵的,因此他们让你可以把类定义 和主构造器结合在一起。当你阅读一个Scala类时,你需要将它们分开。举例来 说,当你看到如下代码时·
class Person (val name: String) {
var age = 0
def desc = s”$name is $age years old”
}
把它拆开成一个类定义·‘
类定义
class Person (val name: String) {
var age = 0
def desc = s”$name is $age years old”
}
和构造器
class Person (val name: String) {
var age = 0
def desc = s”$name is $age years old”
}
嵌套类
。。。
网友评论