Scala面向对象

0目录

1.方法

2.函数

3.面向对象

4.数组;元祖和集合

1.方法

总结:

方法属于对象,所以严格意义上讲属于OOP,但是在函数式编程语言中,也会调用方法,所以scala并不是纯粹的函数式编程语言。

函数也是以一个对象,在OOP的编程思想中,有的时候在定义方法中也需要传入函数作为参数使用。

 

方法本身属于对象,直接以对象.方法的方式调用

函数,本身最高的抽象就是一个对象,可以直接当对象使用

在Scala中方法和函数是不一样的.一般情况下在使用时并不需要特殊区分

写一个简单的函数,求最大值(两个参数,有返回值,返回值为Int)

递归

方法内部调用自己,即为递归
递归方法定义时不能省略返回值类型

举例(计算5*4*3*2*1)

方法的参数

默认参数

在方法的定义时,我们有时会遇到这样的需求: 某些参数通常是不变的数据只有少数情况下才会变化.如果大多数情况下都需要手动传入同样值不符合编程中复用的原则.默认参数就可以解决这类问题.

指定参数

指定参数时指,在调用方法是通过指定参数名来改变参数传递的前后顺序.

可变参数

当方法的参数列表中有多个不确定的参数时,可以使用可变参数,与Java类似.
可变参数用数组来保存,可以直接调用数组的方法.
如果参数列表中既有普通参数,也有可变参数,可变参数必须写在最后.

2.函数

在Scala中函数与方法是不同的.方法依附于对象,而函数本身就是对象.
函数的定义方式也与方法不同

匿名函数

Scala提供了一个相对轻量级的语法来定义匿名函数。源代码中的匿名函数称为函数文字,在运行时,函数文字被实例化为称为函数值的对象。Scala支持一级函数,函数可以用函数文字语法表达,即(x:Int)=> x + 1,该函数可以由一个叫作函数值的对象来表示。

基本介绍

没有名字的函数就是匿名函数,可以通过函数表达式 来设置匿名函数。

匿名函数(也称为 lambda)是作为参数传递给高阶函数的代码块。 维基百科将 匿名函数 定义为“未绑定到标识符的函数定义”。

应用实例

Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。

使用匿名函数后,我们的代码变得更简洁了。

举例

高阶函数

所谓高阶函数其实就是函数的高级使用方式,其中包括

函数作为参数传入方法或函数

函数作为返回值

函数柯里化

偏函数

偏函数(partial function)

偏函数(Partial Function),是一个数学概念它不是"函数"的一种, 它跟函数是平行的概念。

Scala中的Partia Function是一个Trait,其的类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。

模式匹配

模式匹配语法中,采用 match 关键字声明,每个分支采用 case 关键字进行声明,当需要匹配时,会从第一个 case 分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹 配不成功,继续执行下一个分支进行判断。如果所有 case 都不匹配,那么会执行 case _分支, 类似于 Java 中 default 语句。

部分函数

隐式方法,隐私参数和调用(慎用)

定义

调用

首先需要导入

3.面向对象

样例类

一、样例类常用于描述不可变的值对象(Value Object)

二、定义语法:关键字(case class)

1、样例类构造参数默认声明为“val”,自动实现类构造参数的getter

2、样例类构造参数声明为“var”时,自动实现类构造参数的setter和getter

3、样例类自动创建伴生对象

4、样例类自动实现的其他方法

a)toString()、equals()、copy()、hashCode()

b)伴生对象中的apply()、unapply()

注:unapply()接受一个对象,从对象中提取出相应的值,主要用于模式匹配中。

案列:

伴生类和伴生对象

在Scala中Object和class可以同名,名字与某个class相同的Object是这个Class的伴生对象,反之这个Class也叫做这个Object的伴生类.

1.伴生类和伴生对象之间可以互相访问所有属性和方法包括被private修饰的.

2.一般使用伴生对象来定义那些在伴生类中不依赖于实例化对象而存在的成员变量或者方法。类似于Java中用静态修饰的属性和方法.

构造器

新建伴生类和伴生对象并调用主构造器

方式2 (不赋初始值)

Scala中可以定义多个辅助构造函数,类似java中的重载构造函数。Scala中的辅助构造函数都是命名为this。且辅助构造函数必须调用上一级的构造函数,如下(一个参数):

两个和三个参数

Apply 方法

原代码

在伴生对象中定义apply 方法(可以不new)

封装

封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它
部分只有通过被授权的操作(成员方法),才能对数据进行操作。Java 封装操作如下

(1)将属性进行私有化

(2)提供一个公共的 set 方法,用于对属性赋值

(3)提供一个公共的 get 方法,用于获取属性的值

Scala 中的 public 属性,底层实际为 private,并通过 get 方法(obj.field())和 set 方法

(obj.field_=(value))对其进行操作。所以 Scala 并不推荐将属性设为 private,再为其设置

public 的 get 和 set 方法的做法。但由于很多 Java 框架都利用反射调用 getXXX 和 setXXX 方

法,有时候为了和这些框架兼容,也会为 Scala 的属性设置 getXXX 和 setXXX 方法(通过

@BeanProperty 注解实现)。

访问权限

6.1.5 访问权限

1)说明

    在 Java 中,访问权限分为:public,private,protected 和默认。在 Scala 中,你可以通

    过类似的修饰符达到同样的效果。但是使用上有区别。

    (1)Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。

    (2)private 为私有权限,只在类的内部和伴生对象中可用。

    (3)protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以 访问,同包无法访问。

    (4)private[包名]增加包访问权限,包名下的其他类也可以使用

继承和多态

语法

class 子类名 extends 父类名 { 类体 }

(1)子类继承父类的属性和方法

(2)scala 是单继承

案例

新建三个类(动物,猫科动物(继承动物),老虎(继承猫科动物))

多态

逆变和斜边

首先我想要让大家知道的是这三个东西用来干什么的,我们在其他编程语言中常出现一个问题,如果A是B的子类,那么A的对象实例化时,可以赋值给B的引用,但是如果中间隔了一层那父、子类之间的关系就不能用了,比如生成 List[B]=new ArrayList[A] 时,就不可以了

斜变、逆变、非变就是用来解决这个问题的

特质

Scala 语言中,采用特质 trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字 trait 声明。

Scala 中的 trait 中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质。这种感觉类似于 Java 中的抽象类。

Scala 引入 trait 特征,第一可以替代 Java 的接口,第二个也是对单继承机制的一种补充。

基本语法

trait 特质名 {

trait 主体}

案列

特质基本语法

一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素,
所以在使用时,也采用了 extends 关键字,如果有多个特质或存在父类,那么需要采用 with
关键字连接。

没有父类:class 类名 extends 特质 1 with 特质 2 with 特质 3 …
有父类:class 类名 extends 父类 with 特质 1 with 特质 2 with 特质 3…

说明

(1)类和特质的关系:使用继承的关系。

(2)当一个类去继承特质时,第一个连接词是 extends,后面是 with。

(3)如果一个类在同时继承特质和父类时,应当把父类写在 extends 后。

案例实操

    (1)特质可以同时拥有抽象方法和具体方法

    (2)一个类可以混入(mixin)多个特质

    (3)所有的 Java 接口都可以当做 Scala 特质使用

    (4)动态混入:可灵活的扩展类的功能

    (4.1)动态混入:创建对象时混入 trait,而无需使类混入该 trait

(4.2)如果混入的 trait 中有未实现的方法,则需要实现

4.数组;元祖和集合

Scala数组

存储固定大小的元素
数组索引从0开始

Scala元组

1、可以包含不同类型的元素
2、最多支持22个元素(Tuple1~Tuple22)
3、使用下划线“_"访问元素,“_1"表示第一个元素

4、定义元组的方式:

迭代元祖

tupleDemo.productIterator.foreach(x=> println("value:"+x))

将元组元素依次赋给三个变量

val tp1=("zhangsan","andemen",19)

val (name,address,age)=tp1

println(name)

println(address)

println(age)

Scala集合

1、Seq
序列,元素按顺序排列

2、Set
集合,元素不重复

3、Map
映射,键值对集合

不可变集合

scala.collection.immutable,默认Scala选择不可变集合

可变集合

scala.collection.mutable,可以修改、添加或移除一个集合的元素

常用集合

Scala常用集合操作

集合排序操作

Set 常用操作

Set集合求交、并、差集

Scala Map常用操作

Scala Stream & Vecto

Stream是List惰性版,它只会确定第一个值,后面的值用到再求值,可以防止数据过大全部加载导致内存溢出

Vector拥有连续的内存空间,利于随机存取(直接访问)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值