需要特别说明的是:假设变量名为 age,则其对应的 get 和 set 的方法名分别叫做 age 和 age_=。
class Person {
private val name = "heibaiying"
private var age = 12
private[this] var birthday = "2019-08-08"
// birthday 只能被内部方法所访问
def getBirthday: String = birthday
}
object Person {
def main(args: Array[String]): Unit = {
val person = new Person
person.age = 30
println(person.name)
println(person.age)
println(person.getBirthday)
}
}
class Person {
var name = ""
private var age = ""
}
依次执行下面编译命令:
> scalac Person.scala
> javap -private Person
编译结果如下,从编译结果可以看到实际的 get 和 set 的方法名 (因为 JVM 不允许在方法名中出现=,所以它被翻译成$eq),同时也验证了成员变量默认的可见性为 public。
Compiled from "Person.scala"
public class Person {
private java.lang.String name;
private java.lang.String age;
public java.lang.String name();
public void name_$eq(java.lang.String);
private java.lang.String age();
private void age_$eq(java.lang.String);
public Person();
}
class Person {
@BeanProperty var name = ""
}
object Person {
def main(args: Array[String]): Unit = {
val person = new Person
person.setName("heibaiying")
println(person.getName)
}
}
class Person() {
private val name = "HEIBAIYING"
def getName: String = {
// 调用伴生对象的方法和属性
Person.toLow(Person.PREFIX + name)
}
}
// 伴生对象
object Person {
val PREFIX = "prefix-"
def toLow(word: String): String = {
word.toLowerCase
}
def main(args: Array[String]): Unit = {
val person = new Person
// 输出 prefix-heibaiying
println(person.getName)
}
}
3.3 实现枚举类
Scala 中没有直接提供枚举类,需要通过扩展 Enumeration,并调用其中的 Value 方法对所有枚举值进行初始化来实现。
object Color extends Enumeration {
// 1.类型别名,建议声明,在 import 时有用
type Color = Value
// 2.调用 Value 方法
val GREEN = Value
// 3.只传入 id
val RED = Value(3)
// 4.只传入值
val BULE = Value("blue")
// 5.传入 id 和值
val YELLOW = Value(5, "yellow")
// 6. 不传入 id 时,id 为上一个声明变量的 id+1,值默认和变量名相同
val PINK = Value
}