目录
1、类
class Counter{
//定义类中的字段和方法
}
val var
方法定义:def 方法名(参数列表):返回结果类型={方法体}
什么都不返回:Unit
实例化类:
scala中实例化(new)的时候可以不用()
private
尽量使用private:
完整的实例:
当没有方法参数的时候,可以省略圆括号,调用时也不能加圆括号 ;
如果不省略圆括号,那么调用时可以加圆括号也可以不加圆括号。
当只有一条语句时且大括号也可以省略。
使用value和value_来获取和更新私有成员privateValue的值。
且当编译器看到value和value_成对出现时,更新私有值的方法.value_=(3)可简写为
中缀表示法
方法只有一个参数时可以采用中缀调用法
val c=new Counter
c increment 5 //等价于c.increment(5)
返回值的类型省略
:Unit=被省略
Int被省略
2、构造器
定义
类的定义的主体叫构造器
主构造器的参数列表可以有 val 或 var 的属性,但普通的类不可以有。
加了 val 或 var 属性的参数列表会自动变成其类内部的成员字段
实例:
name字段会自动变成Counter类的内部字段,可以对其进行读写。
调用此name字段读写的方法:.name;.name_("Timer")等效于.name="Timer"
主构造器和辅助构造器
主构造器就是类本身的定义体
辅助构造器的第一个表达式必须调用此前已经定义好的辅助构造器或者是主构造器
辅助构造器的调用形式:this(参数列表)
先调用第一个辅助构造器再执行自己要执行的部分
c1:类名后没有参数,调用主构造器。
c2:与第一个辅助构造器匹配,调用第一个辅助构造器
第一个辅助构造器中又必须先执行主构造器,所以先输出“the main constructor”,再输出第一个辅助构造器中的内容
3、对象(单例对象 singleton object)
单例对象
字段方法都是静态的,不用进行实例化,可以直接用其中的方法。相当于Java中的静态实例。
实例:
直接通过Person对象调用自己的静态方法。
伴生对象
class A{...} //单例对象的伴生类 与Object A互为伴生关系
object A{...} //这里的object A是单例对象 同名类的伴生对象
两者定义在同一代码文件内
实例:
person2.info变成了2;注意什么时候动态什么时候静态
孤立对象
class B{...}
object A{...} //孤立对象
4、对象(apply方法)
apply方法是scala中独有的。
不用new对象,因为scala会自动调用该类(Array)的伴生对象Array类的apply方法创建一个数组对象。
apply方法不断生成对象。
工厂方法:生成对象
没有new的原理实例:
孤立对象MyTestApply的存在意义:Main函数的入口
apply存在的意义:
OO:对象.方法
函数式:函数名称(参数)
完美的实现函数调用(.apply(4,5))和函数调用(add(4,5))
函数式调用会自动转变成对象式调用(前提是已经定义好了apply方法)
5、对象(update方法和unapply方法)
update:
把0和"BigData"一起传入update方法实现数组元素的更新。所以是myStrArr(0)
scala已经定义好了Array的伴生类中的apply/update等方法。
unapply:
提取出对象的属性
unapply提取出brand和price两个属性
6、类的继承
抽象类
必须用abstract修饰
类中包含没有被实现的成员
只有类需要使用abstract
没给初值的抽象字段必须给出类型
扩展类
extends(表继承关系)
var不可被重载(本身就是可变的),val可以
greeting方法在父类中已经被实现,必须加override关键字,其余抽象方法重写时可以不加override关键字。
scala类的层次结构:
左边的值类型 被放入寄存器
右边的引用类型 被实例化的对象都被放到堆内存中
Nothing没有实例,只负责错误处理
Null:与Java兼容
Option类
在编程时,若返回值可能为空,最好将返回值类型设为Option
返回值为空时Option类返回None
返回值不为空时Option类会把值封装到some对象中进行返回
实例:
Book:case class:系统会自动帮case class写apply等方法
用了val,变成了成员对象。
Map也自己调用了apply方法(没有new)
Map的get方法的返回值是Option类,有值返回Some对象,空返回None。
Some对象自己还有get方法,None有getOrElse:
7、特质
定义及简介
相当于Java中的接口,但特质既可以定义抽象方法,也可以提供具体方法的实现。
scala中一个类继承于一个超类,但可以混入(mix)多个特质,这样可以重用特质的方法字段,间接实现多重继承。
特质实例:
定义特质中的抽象成员时不用加abstract关键字。
特质可以继承自其他特质。
混入了一个特质的类:
将定义好的特质和定义好的类放到同一个代码文件中时:
特质中的方法可以直接被调用:
混入了多个特质的类
继承了一个父类且混入了多个特质的类:with 特质名 with 特质名...
8、模式匹配
匹配字符
readChar表示需要从键盘上输入字符
_表示除了前面所有以外的。且match不用break,他会自动退出。
匹配字符串:
对不同的类型进行匹配:
有If的匹配
case class 类名:
scala将自动重载许多实用的方法,
且自动为case类生成伴生对象(apply工厂方法;unapply方法:把对象中的字段值提取出来)
模式实例与case:
case Car(brand,price):调用unapply方法提取值。
9、包
避免程序中的命名冲突,体现层次感。
不同的包可以进行前缀定义
通配符下划线:import *.*.*._