目录
六、面向对象编程
a、Scala包
- 基本语法:package 包名
- Scala包的三大作用(和java一样)
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
- 包的命名
- 命名规则:只能包含数字、字母、下划线、小圆点.,但不能用数字开头,也不要使用关键字。
- 命名规范:一般是小写字母+小圆点
- 包说明(包语句)
- Scala 有两种包的管理风格,一种方式和 Java 的包管理风格相同,每个源文件一个包(包 名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系,如 com.atguigu.scala。另一种风格,通过嵌套的风格表示层级关系,如下
package com{ package atguigu{ package scala{ } } }
- 一个源文件中可以声明多个 package、子包中的类可以直接访问父包中的内容,而无需导包
- Scala 有两种包的管理风格,一种方式和 Java 的包管理风格相同,每个源文件一个包(包 名和源文件所在路径不要求必须一致),包名用“.”进行分隔以表示包的层级关系,如 com.atguigu.scala。另一种风格,通过嵌套的风格表示层级关系,如下
- 包对象
- 说明:在 Scala 中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对 应包下所有 class 和 object 的共享变量,可以被直接访问。
- 若使用 Java 的包管理风格,则包对象一般定义在其对应包下的 package.scala 文件中,包对象名与包名保持一致。
- 如采用嵌套方式管理包,则包对象可与包定义在同一文件中,但是要保证包对象 与包声明在同一作用域中。
- 导包说明
- 和 Java 一样,可以在顶部使用 import 导入,在这个文件中的所有类都可以使用。
- 局部导入:什么时候使用,什么时候导入。在其作用范围内都可以使用
- 通配符导入:import java.util._
- 给类起名:import java.util.{ArrayList=>JL}
- 导入相同包的多个类:import java.util.{HashSet, ArrayList}
- 屏蔽类:import java.util.{ArrayList =>_,_}
b、Scala类
可以将类理解为用来创建对象的蓝图或模板。定义好类以后,就可以用new关键字类创建对象。
- 类的定义
Scala的类用关键字class声明。最简单的类定义形式是:
class Counter{
//这里定义类的字段和方法
}
其中,Counter是类名,Scala中建议类名都用大写字母开头。在类的定义中,字段和方法统称为类的成员,其中字段是指对象所包含的变量,它保存了对象的状态或者数据,而方法是使用这些数据对对象进行各种操作可执行程序块。Scala中建议字段名和成员名都采用小写字母开头。字段的定义和变量的定义一样,用val和var进行定义,方法用关键字def定义。基本的语法为:
def 方法名(参数列表):返回的结果类型 = {方法体} 例如:(完整的类定义) class Counter { var value = 0 def cc(step:Int):Unit = {println("Scala" + step)} def cc2():Int = {value} }
在上面的类定义中,包括一个字段value和两个方法。其中方法cc接受一个Int型的参数,返回值为Unit;方法cc2没有参数,返回一个Int型的值。与java不同的是,在Scala的方法中不需要依靠return语句来为方法返回一个值;对与Scala而言,方法里面最后一个表达式的值就是方法的返回值。有了类的定义,就可以使用new关键字类进行实例化,并通过实例化对象的成员进行访问。例如:
val myCounter = new Counter myCouter.value = 5 //访问字段 myCouter.add(3) //调用方法 println(myCouter.current) //调用无参数方法时,可以省略方法名后面的()
Scala允许类的嵌套定义,即在一个类定义体里在定义另外一个类。
class Cc(name:String,subname:String){//顶层类 case class Ncc(name:String)//嵌套类 def show{ val c = new Ncc(subname) println(s"xm $name includes a Nested $c.name") } } val t = new Cc("A","B") t.show
- 类成员的可见性
在Scala类中,所有成员的默认可见性为公有,且不需要用public关键字进行限定,任何作用域内都能直接访问公有成员。除了默认的公有可见性,Scala也提供与java类似的可见性选项包括private和protected,其中,private成员只对本类型和嵌套类型可见;protected成员对本类型和其他类型都可见。
Scala不推荐将字段的可见性设置为默认的公有,而建议将其设置为private,这是为了实现对这些私有字段的访问,Scala采用类型java中的getter和setter方法,定义了两个成对的方法value和value_=,其中value是需要暴露字段名字。例如,对于前面定义的Counter类,为了避免直接暴露公有字段value,可以进行重写。
class Counter{
private var privateValue = 0
def value = privateValue
def value_ = (newValue: Int){
if(newValue > 0 ) privateValue = newValue
}
def increment(step: Int): Unit = (value += step)
def curret():Int = {value}
}
上面定义了一个私有字段privateValue,该字段不能直接从外部访问,而是通过方法value和value_对外进行访问和修改,相当于Java中的getter和setter方法。