A. 类的定义
Scala中,类并不用声明为public
Scala源文件中可以包含多个类,所有这些类都具有公有可见性
val修饰的变量具有只读属性,有getter但没有setter方法,相当于java中的final修饰的变量
var修饰的变量既有getter,又有setter方法
类私有字段,即private修饰的变量,只能够在类的内部以及伴生对象中使用
- 对象私有字段,即private[this]修饰的变量,访问权限更加严格,只能在类的内部中使用
class Person {
val id = "9527" //用val修饰的变量是只读属性,有getter但没有setter,相当于java中的final修饰的变量
var age = 18 //用var修饰的变量既有getter又有setter
private var name = "唐伯虎" //类私有字段,只能在类的内部以及伴生对象中使用
private[this] val pet = "小强" //对象私有字段,访问权限更加严格,只能在类的内部方法中使用
def printPet: Unit = {
print(pet)
}
}
object Person {
def main(args: Array[String]): Unit = {
val p = new Person
println(p.id + " " + p.age + " " + p.name)
p.age = 20
p.name = "祝枝山"
println(p.id + " " + p.age + " " + p.name)
p.printPet
}
}
B. 构造器
主构造器会执行类定义中的所有语句,如果有函数,函数仅仅被加载,并函数不会被执行
每个类都有主构造器,主构造器中的参数直接放在类名后面,与类交织在一起
class Animal(val id: String, var name: String) {
println("id: " + id + ", name: " + name) //主构造器会执行类定义中的所有语句
def sayHi(): Unit = { //函数仅仅被加载,不会被执行,除非被调用
println("hi..." + name)
}
}
object Animal {
def main(args: Array[String]): Unit = {
val a = new Animal("01", "dog")
}
}
3. 主构造器中参数如果不带有val,var修饰,则该参数为对象私有化字段,等同于private[this] val修饰的字段
4. 辅助构造器中参数不能用val, var修饰
5. 先调用主构造器,再调用辅助构造器,意味着每次先执行类中定义的所有语句,再执行辅助构造器
class Animal(val id: String, var name: String, gender: String) {
print("id: " + id + ", name: " + name + ", ") //主构造器会执行类定义中的所有语句
println("gender: " + gender) //只能在类中访问gender
// gender = "f" //报错,Reassignment to val:说明gender被val修饰
var age: Int = -1
def this(id: String, name: String, gender: String, age: Int) {
this(id, name, gender)
this.age = age
println("age: " + age)
}
println("age: " + age)
}
object Animal {
def main(args: Array[String]): Unit = {
val a = new Animal("01", "dog", "m")
val a2 = new Animal("02", "cat", "f", 2) //先调主构造器,再调辅助构造器,导致每次都能将age输出为-1
// a.gender //报错,Cannot resolve symbol gender:伴生对象都不能访问,说明gender被private[this]修饰
}
}