设为首页 加入收藏

TOP

scala面向对象.高阶函数,柯里化,Actor编程简介(一)
2017-10-09 13:25:24 】 浏览:1162
Tags:scala 面向 对象 高阶 函数 柯里化 Actor 编程 简介

1.定义一个类
class Person{
//用val修饰的变量是只读属性,有getter但是没有setter
val id ="111"
//用var修饰的变量既有getter又有setter
var age:Int =18
//类私有字段,只能在类的内部使用,只有伴生对象内可以使用
private var name:String ="aaa"
//对象是由字段,访问权限更加严格,只有person类的方法才能访问当前对象的pet字段
private[this]val pet="bbb"
}

2.构造器
每个类都有主主构造器,主构造器的参数直接放置类名后面,与类交织在一起,主构造器会执行类定义中的所有语句

class Person(val name:String){
//主构造器定义的所有语句都会执行
?? println("执行主构造器")

??private var age=11
??def this(name:String,age:Int){
??//每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始
???? this(name);
????println("执行辅助构造器")
????this.age = age
??}
}

构造器参数可以不带var或val,如果不带val或var的参数至少被一个方法所使用,那么它将会被提升为字段
//在类名后面加private就变成了私有的
?? class moon private(val name:String,prop:Array[String],private var age:Int =18){
?? ?? println(prop.size))
//prop被下面的方法使用,prop就变成了
?? ?? def da = prop.toBuffer
}

object sun{
?? def main(args:Array[String]) {
?? ?? //私有构造器,只能在伴生对象中使用
?? ?? val q = moon("aa",Array("111","222"),20)
?? ?? println(q.da())
?? }
}

3.单例对象

在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.存放工具方法和常量
2.高效共享单个不可变的实例
3.单例模式

object SingletonDemo {
?? def main(args: Array[String]) {
?? ?? //单例对象,不需要new,用【类名.方法】调用对象中的方法
?? ?? val session = SessionFactory.getSession()
?? ?? println(session)
?? }
}

4.伴生对象

在Scala的类中,与类名相同的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性

class Dog {
?? val id = 1
?? private var name = "itcast"

?? def printName(): Unit ={
?? ?? //在Dog类中可以访问伴生对象Dog的私有属性
?? ?? println( Dog.CONSTANT + name )
?? }
}

/**

  • 伴生对象
    */
    object Dog {

//伴生对象中的私有属性
?? private val CONSTANT = "汪汪汪 : "

?? def main(args: Array[String]) {
???? val p = new Dog
???? //访问私有的字段name
???? p.name = "123"
???? p.printName()
?? }
}

5.apply方法

通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用
val arr1 = Array(5)
println(arr1.toBuffer)

调用了Array伴生对象的apply方法,arr1中只有一个元素5

6.Scala程序都必须从一个对象的main方法开始,可以通过扩展App特质,不写main方法。

7.继承一个类或实现一个接口,关键字都需要使用extends,继承后再实现需要用关键字with,

8.在Scala中重写一个非抽象的方法必须使用override修饰符

9.类型检查和转换需要使用obj.isInstanceOf[C]

10.Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。
并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配

11.匹配模式

object CaseDemo01 extends App{
??//val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"
?? val arr = Array("hello", 1, 2.0, CaseDemo)
?? val v = arr(Random.nextInt(4))
?? println(v)
?? v match {
???? case x: Int => println("Int " + x)
???? case y: Double if(y >= 0) => println("Double "+ y)
???? case z: String => println("String " + z)
???? case _ => throw new Exception("not match exception")
??}
}
匹配模式关键字使用match,case进行每种类型的匹配
case y: Double if(y >= 0) => ...
模式匹配的时候还可以添加守卫条件。如不符合守卫条件,将掉入case _中

在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

12.Option类型

在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值
def main(args: Array[String]) {
?? val map = Map("a" -> 1, "b" -> 2)
?? val v = map.get("b") match {
???? case Some(i) => i
???? case None => 0
?? }

13.偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配

def func1: PartialFunction[String, Int] = {
?? case "one" => 1
?? case "two" => 2
?? case _ => -1
}

1

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇spark-shell简单使用介绍(scala) 下一篇在linux上安装Scala详细步骤

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目