Scala中的类
摘要
网络上很多资料讲得不清不楚的,有些甚至是片面的错误的,看语言应该是直接用翻译器将英文翻译成中文。所以依照着网上的一些说法和自己的实验重新将一些概念和定义讲解一些。
scala编译器会自动为类中的字段添加getter方法和setter方法
可以自定义getter/setter方法来替换掉编译器自动产生的方法
用@BeanProperty注解来生成JavaBeans的getXxx/setXxx()方法
每个类都有一个主要的构造器,这个构造器不是单独声明的构造函数,而是和类定义交织在一起。它的参数直接成为类的字段。主构造器执行类声明中所有的语句。
辅助构造器是可选的,它们叫做this。
简单类和无参方法
简单类
Scala类最简单的形式看上去和Java或c+++的很相似:
class Counter {
private var value = 0 // 你必须初始化字段
def increment() { value += 1 } // 方法默认是公有的
def current() = value
}
val myCounter = new Counter // 或new Counter()
myCounter.increment()
println(myCounter.current) // 1
无参方法
调用无参方法比如current时,你可以写上圆括号,也可以不写:
myCounter.current
myCounter.current()
应该用哪一种形式呢,我们认为对于改值器方法,即改变对象状态的方法使用(),而对于取值器方法,它不会改变对象状态的方法,所以去掉()。这也是我们在示例中的做法:
myCounter.increment() //对改值器使用()
println(myCounter.current) //对取值器不使用()
你可以通过以不带()的方式声明current来强制这种风格:
class Counter {
def current = value //定义中不带()
}
这样一来类的使用者就必须用myComter.current,不带圆括号。
访问级别
Java
修饰符 | Class | Package | Subclass | World |
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
no modifier | Y | Y | N | N |
private | Y | N | N | N |
Java的四种访问级别在上面罗列了。成员变量、成员函数什么的都是非常常见的使用方法,因为资料非常多,也就不详细说明了。
唯一让我觉得有趣的是
private class
的问题。虽然不知道在OOP中会不会有这样的设计,但是我突然就想到了,便研究了一下。
对于一个.java的文件,我们对于文件的命名和文件中类的命名有如下的规则:
- Java保存的文件名必须与类名一致;
- 一个Java文件中只能有一个顶层public类;
- 一个Java文件中不能有一个顶层private类;
- 如果文件中不止一个类,文件名必须与public类名一致;
- 如果文件中不止一个类,而且没有public类,文件名可与任一类名一致。
所谓的顶层类(外部类)指的是可以直接通过包来访问的。
而private类是不能作为外部类的,因为没有任何其他东西能够访问它。
private class SomePrivateClass{ ... }
会导致报错。
使用的方式是在外面嵌套一个顶层类
public class OuterClass {
private class InnerClass {
...
}
...
}
Scala
在Scala中,没有类似Java中那样public
。它的默认修饰符,即no modifier
就是相当于public
。
修饰符 | Class | Companion | Subclass | Package | World |
no modifier | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N ∗ ∗ | N |
private | Y | Y | N | N ∗ ∗ |