scala定义类:
class Counter{
private var value = 0 //你必须初始化字段
def increment(){ value += 1}//方法默认是公有的
}
类有一个主构器和任意多的辅助构造器,类如果没有显示定义一个主构造器则自动拥有一个无参的主构造器;
辅助构造器的名称为this,每一个辅助构造器都必须以一个先前定义的其它辅助构造器或主构造器调用开始
class Person{
private var name = ""
private var age = 0
def this(name:String){
this()//调用主构造器
this.name = name
}
def this(name:String,age:Int){
this(name)//调用一个辅助构造器
this.age = age
}
}
可以以三种方式构造对象:
val p1 = new Person//调用主构造器
val p2 = new Person("Fred")//调用第一个辅助构造器
val p3 = new Person("Fred",43)//调用第二个辅助构造器
在scala中,每个类都有主构造器,主构造器并不以this方法定义,而是与类定义交织在一起。
1.主构造器的参数直接放置在类名之后
class Person(val name:String,val age:Int){
//(...)中的内容是主构造器的参数
...
}
主构造器的参数被编译成字段,其值被初始化成构造时传入的参数,在本例中name和age成为Person类的字段。
2.主构造器会执行类定义中的所有语句。例如在以下类中:
class Person(val name:String,val age:Int){
println("Just constructed another person")
....
}
println语句是主构造器的一部分,每当有对象构造出来时,上述代码就会被执行
scala定义对象
scala类没有静态方法与静态字段,通常会用到既有实例方法又有静态方法的类,可以通过类和与类同名的“伴生”对象来达到同样的目的,例如:
class Account{
val id = Account.newUniqueNumber()
private val balance = 0.0
def deposit(amount:Double) { balance += amount}
}
object Account{//伴生对象
private var lastNumber = 0
private def newUniqueNumber() = {lastNumber += 1;lastNumber}
}
类与它的伴生对象可以相互访问私有特性,它们必须同在于同一源文件中。
scala使用对象来实现:1.作为存放工具函数与常量的地方
2.高效地共享单个不可变实例
3.需要单个实例来协调某个服务时(参考单例模式)
另外,对象可以扩展类以及一个或多个特质,例如:
abstract class UndoableAction(val description:String){
def undo():Unit
def redo():Unit
}
object DoNothingAction extends UndoableAction("Do Nothing"){
override def undo(){}
override def redo(){}
}
DoNothingAction对象可以被所有需要这个缺省行为的地方共用<<快学scala>>读书笔记