熟悉JAVA/C++的人会发现Scala里的某些概念虽然相似,但却不完全相同。
类 (class)
简单类和方法定义
简单类类形式和JAVA/C++很像:
class Counter{
private var value: Int = 0
def increment(): Unit = value += 1
def count() :Int = value
}
在scala中并不需要申明public, scala源文件中可以包含多个类,这些类都是公有的。
定义一个类对象,并进行调用:
scala> val flag = new Counter()
flag: Counter = Counter@3b05a99b
// scala 中可以不带 () 来进行调用该方法, 这在C++中就是不可以的会返回一个函数指针。
scala> flag.count
res0: Int = 0
scala> flag.increment
scala> flag.count()
res2: Int = 1
带 setter 和 getter 的属性
在JAVA中定义一个带 setter 和 getter 的属性:
public class Person{
private int age;
public void setAge(int age) { this.age = age;}
public int getAge() { return this.age ; }
}
之所以不建议使用 public 属性的成员变量而采用 getter和setter的方法,是因为它们让你可以从简单的get和set机制出发, 并在需要的时候进行改进。 但也不意味着它们总是好的。通常情况下如果使用者都可以对一个状态进行获取和设置这是比较不好的事情。
下面我们来看下Scala :
- 先定义一个Person类
class Person{
val country = "china"
var name = "borey"
private var phone = "123456789"
// scala 允许更加严格的访问限制, 通过 private[this] 这个修饰符来实现
private [this] var money = 999999999
}
- 用scalac编译下, 再用javap查看下字节码
prod@AWS-TEST-DT:~/borey_zhu/scala$ scalac Person.scala
prod@AWS-TEST-DT:~/borey_zhu/scala$ ls
Person.class Person.scala
prod@AWS-TEST-DT:~/borey_zhu/scala$ javap Person
Compiled from "Person.scala"
- 生成的Java代码:
public class Person {
private final java.lang.String country;
private java.lang.String name;
private java.lang.String phone;
private int money;
public java.lang.String country();
public java.lang.String name();
public void name_$eq(java.lang.String);
private java.lang.String phone();
private void phone_$eq(java.lang.String);
public Person();
}
通过上面scala的定义编译和反译,很快就能得出scala类中定义的结构:
定义 | public getter | public setter | private getter | pivate setter | 备注 |
---|---|---|---|---|---|
var | yes | yes | yes | yes | |
val | yes | no | yes | no | 仅带 getter 属性 |
private var | no | no | yes | yes | |
private [this] var | no | no | no | no | 对象私有字段 |
说明:
在Scala中, getter和setter方法并非定义为getXxx
和setXxx
, 而是定义为xxx和xxx_方法( = 号被翻译为$eq, 是因为JVM中