定义一个Person.scala类,如下:
package person
class Student(val name:String, var age:Int) {
private var job = "Programmer"
private[this] var salary = 3000F
}
然后编译该文件,使用反编译工具查看Person.class文件:
$ javap -p target/scala-2.11/classes/person/Student.class
Compiled from "Student.scala"
public class person.Student {
private final java.lang.String name;
private int age;
private java.lang.String job; // private修饰,生成的private的getter/setter方法
private float salary; // private修饰,没有生成getter/setter方法
public java.lang.String name();
public int age();
public void age_$eq(int);
private java.lang.String job(); // job字段的private的getter方法
private void job_$eq(java.lang.String); // job字段的private的setter方法
public person.Student(java.lang.String, int);
}
这就是Scala编译器private和private[this]对做的工作:
(1)对于类私有的字段,Scala生成私有的getter/setter方法;
(2)对于对象私有的字段,Scala不生成getter/setter方法。
使用案例
class PackageStudy {
private var a = 0
private[this] var b = 1// 只能在类内部使用,对象都不能直接使用
def getb(): Int = b
var m = PackageStudy.c
// var n = PackageStudy.d
// 在伴生类中直接访问伴生对象的 private[this] 变量,会报错。
var o = PackageStudy.get_d()
}
object PackageStudy {
private var c = 2
private[this] var d = 3
// 伴生对象的 private[this] 变量,也只能在对象内部使用,在伴生类中无法直接使用。
def get_d(): Int = d
def main(args: Array[String]): Unit = {
val a_obj = new PackageStudy
println(a_obj.a)
// println(a_obj.b) //直接访问 类中的 private[this] 的变量,会报错
println(a_obj.getb())
println(a_obj.m)
println(a_obj.o)
}
}