class Counter {
private var age = 0 // 必须初始化字段
def incre() { // 方法默认是公用的
age += 1
}
def current() = age // 可以不带()
}
//调用部分
val myCounter = new Counter // 或new Counter()
myCounter.incre()
println(myCounter.current) // 调用无参数方法()可以加上
getter和setter被称为值得属性,可以在方法里定义取值和改值具体限制。
在下面案例中getter
和setter
分别叫做age
和age_=
,如果下面定义的是私有变量,那么这两个方法也是私有的。公有字段的这两个方法是公有的。
class Person {
var age = 0
}
class Counter {
private var Age = 0 // 必须初始化字段
def age_= (newAge: Int) {
if (newAge > Age) // 保证值不能变小
Age = newAge
else
println("不能使值变小!")
}
val myCounter = new Counter
myCounter.age = 10
myCounter.age = 3
println(myCounter.age)
Scala对每个字段都生成getter和setter方法,这些字段要被定义为var,若字段是val,只有getter方法生产。
Scala中不能只写setter,不写getter。(会报错)
class Counter {
private var value = 0
def increament() {
value += 1
}
// 可以访问另外一个对象的私有变量
def isLess(other: Counter) = value < other.value
}
private [this] var value = 0
,这种定义字段被成为对象私有字段,scala不会生成getter或setter方法。getFoo/setFoo
方法。只要在scala字段标记@BeanProperty时,这样的方法会自动生成。 import scala.reflect.BeanProperty
class Person {
@BeanProperty var name: String = _
}
scala中辅助构造器和Java中的构造函数对应。
辅助构造器名称是this
辅助构造器必须以一个先前以一个已经定义的主构造器或其他辅助构造器的调用开始。
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
}
}
var p1 = new Person
var p2 = new Person("Aaron")
var p3 = new Person("Aaron", 23)
每个类都有主构造器。
主构造器的参数直接放置在类名之后,可以使用默认参数,如age。
class Person(val name: String, val age: Int =0) {
...
}
主构造器会执行类中的所有语句。
如果类名后没有参数,则该类是一个无名主构造器。
构造参数不带val或var,这样参数如何处理取决于它们在类中如何使用。
主构造器参数生成的字段和方法:
import scala.collection.mutable.ArrayBuffer
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
}
【待续】
内容来源于网络,如有侵权,请联系作者删除!