hangscer

Scala的类

2017/02/11

4.Scala的类

Scala纯粹的面向对象,它仍然不得不支持Java那些不太纯正的OO概念,比如静态方法。使用伴生对象(companion object)。

1
2
3
4
5
6
7
8
9
10
class Car(val year:Int){
private var milesDriven:Int=0
def miles=milesDriven
def drive(distance:Int)={
milesDriven+=Math.abs(distance)
}
def hello=println("hello hello hello")
hello
println("hshddhqwdhqw") //what??
}

Scala把主构造函数放到类定义中

先看看下面的定义:

1
2
class CreditCard(val number:Int,var creditLimit:Int)
class CreditCard(val number:Int,var creditLimit:Int,xy:Int)

这就是类的完整定义,如果无需王类里添加方法或属性,连{}都不需要。

我们把number声明为val,Scala把它定义为一个private final字段,同时创建public number()方法,用以取值。creditLimit声明为var,Scala将它定义为private字段,叫做creditLimit,并生成publicgettersetter方法。

如果参数不是var。也不是val,那么Scala创建一个private字段以及privatesettergetter方法。所以不可以在类外访问这个方法。

放在类定义中的任何表达式或者可执行语句都会作为主构造函数的一部分执行,参照hello和 what??

除了在主构造函数中提供参数外,还可以在类中定义其他字段、方法、零个或者多个副构造函数。下面的代码中,this()就是副构造函数,还定义了position变量,改变了toString的方法。

1
private var position :String= _ //_是什么含义

这个下划线(_)代表的是默认值,对于Int值来说,就是0;对于Double来说,就是0.0。对于引用类型,它就是null。通过_,Scala方便实用默认值初始化var。不过适用于val,因为val变量不可修改。

4.3 类继承

和Java类似,不过两点限制:

  1. 重写方法必须override关键字
  2. 只有主构造函数才能往基类构造函数中传参数

不写override可能写出一个新的同名函数。

Scala的副构造函数必须调用主构造函数或者另一个副构造函数(调用链的终点是主构造函数)。在Scala中,主构造函数如同一道关卡,类的实例通过它初始化。

4.4 单例对象

使用object解决问题。

1
2
3
4
5
6
7
8
9
10
11
class Maker(val color:String){
println("Createing "+this)
override def toString()="maker color "+color
}
object MakerFactory{
private val makers=Map(
"red"->new Maker("red"),
"blue"->new Maker("blue"))
def getMaker(color:String)=if(makers.contains(color)) makers(color) else null
}
println(MakerFactory getMaker "blue")

4.5 独立对象和伴生对象

上面的MakeFactory是独立对象。它并未自动关联任何一个类上,即便它管理着Maker的实例。

Scala可以创建一个关联到一个类上的单例,这样的单例同类共享相同的名字,它就是伴生对象。

类和伴生对象之间没有界限——它们可以互相访问彼此的private字段和private方法。下面将主构造函数标记为private。

每个类都可以有伴生对象,把伴生对象和类写在一个文件中,在Scala中很常见

1
2
3
4
5
6
7
8
9
10
class Maker private (val color:String){//加private之后 只有伴生实例中可以new 它
println("Createing "+this)
override def toString()="maker color "+color
}
object Maker{
private val makers=Map(
"red"->new Maker("red"),
"blue"->new Maker("blue"))
def getMaker(color:String)=if( makers.contains(color) ) makers(color) else null
}

4.6 Scala中的static(没有)

Scala没有静态字段和静态方法。通过伴生对象的使用,达到Java的static一样作用。

类一级的操作绑定在伴生对象中去。

比如将类的主构造函数private,而在伴生对象中以函数接口形式开放。(构造器模式)