class
1. 类是对象的抽象,对象是类的实例。类是抽象的不占用内存,对象是具体的,占用内存。
2. Scala中,类不声明为public。Scala源文件可包含多个类,它们都具有公有可见性。
3. 定义无参类或方法时,定义F => 调用F、 定义F() => 调用F or F(); 定义C => new C or new C()、定义C() => new C or new C()
class Counter { // or class Counter()
var value = 0 // 字段value默认是私有的,但不等价于 var private value = 0.
def increment() { value += 1 } // or increment,方法默认是公有的
def current = value // or current()
}
val myCounter = new Counter // 生成对象 or new Counter()
myCounter.increment() // or increment
println(myCounter.current)
规范1:类名首写字母为大写,变量和函数首写字母为小写,常量为全大写,均采用驼峰标识。
规范2:无参类,()省略;无参方法,当方法返回值时 => ()省略,否则不省括号。因此increment()推荐。
getter and setter
1. Scala中,类中的字段自动带有getter和setter方法,Scala生成面向JVM类时,不带有访问控制符的字段默认是私有的,
其对应的getter/setter方法默认是公有的。当字段修饰为private时,getter/setter方法变为私有的。
注意:Scala中,类的字段不同于java,它是一个私有字段 + getter方法(val)or + getter/setter(var),
不会出现只有setter 而无 getter的情况,因为在Scala中无法实现只写属性。对于一个字段,它可能同时不具备
setter和getter,当该字段是对象私有的时候(private[this]修饰)。
class Person {
var age = 0
}
scalac Person.scala
javap -private Person
public class Person {
private int age; // 字段默认为private;age为val时则private final int age
public int age(); // 字段age的getter叫做 age;字段age为private时,public -> private
public void age_$eq(int); // 字段age的setter叫做 age_=,编译器将=译为$eq;val age -> 不带有setter方法
public Person();
}
2. 可以自定义字段的getter和setter方法。
class Person {
var age = 0
def age_=(newAge: Int) {age = newAge } // error: method age_= is defined twice
}
改写为:
class Person {
private var privateAge = 0
def age = privateAge
def age_=( newValue: Int ) { if ( newValue> privateAge ) privateAge = newValue
}
val fred = new Person fred.age = 30 fred.age = 21 结果为:fred.age为30
反编译结果为:
public class Person {
private int privateAge ;
private int privateAge ();
private void privateAge _$eq(int);
public int age (); // 是没有publice int age字段的。
public void age _$eq(int);
public Person();
}
说明:某个模块提供的所有服务都应该通过统一的表示方法访问到,至于它们是通过存储(变量)还是计算(方法)得到的,
从访问方式上无从知晓。在Scala中,fred.age的调用者并不知道age是通过字段还是通过方法来实现的。(JVM中,该服务
总是通过方法实现的,要么是编译器合成,要么由程序员提供。)
3. 无setter和getter方法
主构造器 and 辅构造器
object