Scala--类

  scala类,是比较精简。主构造器和类交织在一起,而且,scala类上面声明的全局变量,自带了get/set方法,还可以转化为java的bean。总体来说比较简单,精简,易懂。

一个简单的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Created by xiaoxiaomo on 2016/3/28.
*/

class SimpleClazz {

private var num = 0 ;//必须初始化

//默认是一个public方法
def increase(): Unit ={
num += 1 ;
}
//一个简单的取值方法
def getIncrease = num ;

}

//测试一下
object TestSimpleClazz{
def main(args: Array[String]) {
val simple = new SimpleClazz()
simple.increase() //建议有“()”
println( simple.getIncrease ) //可以省略“()”
}
}
  • 运行结果
1
1

scala文件可以包含多个类,类中的成员变量必须初始化
调用scala类中需要new 类[()],“()”可以省略。
调用该方法是如果是一个简单的取值方法可以省略“()”,否则建议添加“()”。注:只是建议的一种风格而已。

get/set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import scala.beans.BeanProperty

/**
* Created by xiaoxiaomo on 2016/3/28.
*/

class GetSetClazz {

//必须初始化
//默认共有字段,自带共有get/set方法
var name = "twosnail"

//共有字段,由于声明为val不能修改所以只带get方法
val age = 23

//私有字段,只有自己能访问的get/set方法
private var sex = 1

//私有字段,只有自己能访问的get方法
private val work = "hadoop工程师"

//@BeanProperty生成JavaBeans规范get/set
@BeanProperty var height = 175.00

def setSex( sex : Int): Unit ={
if( sex != 0 && sex != 1 ){
println("性别设置异常!")
} else this.sex = sex
}

def getSex = sex //自定义的方法
def getWork = work //自定义方法提供给外部访问

}

//测试一下
object TestGetSetClazz{
def main(args: Array[String]) {
val clazz = new GetSetClazz()
//var name 可以get/set
clazz.name = "xiaoxiaomo"
println(clazz.name)
//val age 只有get
println(clazz.age)
//java规范或者普通的
clazz.setHeight(180.00)//等于 clazz.height = 180.00
println(clazz.getHeight)//等于 println(clazz.height)

//调用自定义方法
clazz.setSex(0)
println(clazz.getSex)
println(clazz.getWork)
}
}
  • 执行结果
1
2
3
4
5
xiaoxiaomo
23
180.0
0
hadoop工程师

对于get/set的用法很简单,只需要记住几点就行了:

成员变量需要需要初始化
默认共有的字段外部可以访问和修改val类型的不可以修改
私有的成员变量外部不可以访问,在类的作用范围内可使用
访问当权对象的字段可以使用this
变量声明前加@BeanProperty生成JavaBeans规范get/set,即getXXX,setXXX。

构造器

主构造器

在scala中,每一个类都用主构造器,并和类的定义交织在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 主构造器
* Created by xiaoxiaomo on 2016/3/28.
*/

class StructureClazz( val name:String , private var age :Int = 0) {

println("这是一个主构造器! name:"+ name)

def addAge = age += 1
def getAge() = age
}

object TestStructure{
def main(args: Array[String]) {
val test = new StructureClazz("xiaoxiaomo")
println(test.getAge())
}
}
  • 运行结果
1
2
这是一个主构造器! name:xiaoxiaomo
0

记住重要的一点,就是:默认的构造器(主构造器)和类交织在一起

主构造器的参数直接跟在类名后面
主构造器如果没有参数,就是一个无参的主构造器,仅仅是简单的执行以下类里面的语句;
参数可以添加默认值,修饰符,如果没有默认值时在构造这个函数时必须传值初始化
构造一个构造器时,会默认执行类中语句(我们可以去加载一些配置文件等)。

辅助构造器

scala类中,除了主构造器之外还有很多辅助构造器,赋值构造器使用this命名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 辅助构造器
* Created by xiaoxiaomo on 2016/3/28.
*/

class AssistClazz( val name:String , private var age :Int = 0) {

private var sex = 0
private var height = 175.0

//第一个辅助构造器
def this(sex:Int){
this("xiaoxiaomo")//调用的主构造器
this.sex = sex
}

//第二个辅助构造器
def this(sex:Int,height:Double){
this(sex)//调用的上面一个辅助构造器
this.height = height
}
}

//测试一下
object TestAssistClazz{
def main(args: Array[String]) {
new AssistClazz("twosnail")//调用的主构造器
new AssistClazz("twosnail",23)//调用主构造器
new AssistClazz(1)//调用第一个辅助构造器
new AssistClazz(1,178.0)//调用第二个辅助构造器
}
}

辅助构造器的名称为this;
每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始(必须在第一行);
通常我们可以在主构造器中使用默认参数来避免过多的使用辅助构造器;

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器