//Person.scala
class Person(val name:String, var age:Int) {
private var job = "Programmer"
private[this] var salary = 3000F
def changeJob(job: String) = this.job = job
def increaseSalary(amount: Float) = salary += amount
def hasSameJobWith(other: Person) = this.job.equals(other.job)
// 下面other.salary将编译失败:Symbol salary is inaccessible from this place
//def hasSameSalaryWith(other: Person) = this.salary.equals(other.salary)
}
object Main {
def main(args: Array[String]): Unit = {
val person = new Person("Tom", 30)
// 下面两个语句都正确,但缺和Java用法不一样,Java里,通常使用person.getName()和person.getAge()
println(person.name)
println(person.age)
// 下面语句将编译失败:Symbol job is inaccessible from this place
//println(person.job)
// 下面语句将编译失败:Symbol salary is inaccessible from this place
//println(person.salary)
}
}
仔细体会private和private[this]的区别!!!
使用Java语言实现如下:
//PersonJava.java
public class PersonJava {
private String job = "Programmer";
private Float salary = 3000F;
public String name;
public int age;
public PersonJava(String name, int age) {
this.name = name;
this.age = age;
}
public void changeJob(String newJob) {
this.job = newJob;
}
public void increaseSalary(Float amount) {
salary += amount;
}
public boolean hasSameJobWith(PersonJava other) {
return this.job.equals(other.job);
}
public boolean hasSameSalaryWith(PersonJava other) {
// 在Java语言里this.salary和other.salary之间是互相可见的,但在Scala里,由于使用了private[this],彼此不可见。
return this.salary.equals(other.salary);
}
}