spark快速开发之scala基础之3类,对象,特征
Posted 我从二院来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark快速开发之scala基础之3类,对象,特征相关的知识,希望对你有一定的参考价值。
类
scala的类定义非常灵活
class test4 class test2{} class test3(x:Int)
定义一个带构造函数的类
class Point (x : Int,y : Int){ def add() : Int = { x1 + y2 } }
通过this来重写构造函数
def this(X1 : Int){ this(X1,1) } def this(X2 : String){ this(0,1) }
除了重写构造函数,还可以当作当前对象的引用。
def add(x:Int) : this.type = { this }
等价于
def add(x : Int,y : Int) : Point = { this }
继承
scala属于单继承。跟java一样,scala使用extends关键字来继承父类,使用override重写父类方法。scala的方法的重载与重写遵循java的规则。
class print (x : Int) extends Point(1,1){ override def add(x : Int,y : Int) : this.type = { this } }
case class
case class跟普通class略有区别
1:case class可直接使用,不需new()。
2:case class默认实现了序列化。
3:case class默认重写了equals和hashcode。
4 : case class可以自动对属性进行模式匹配以及隐式转换。
比如在spark中,读取文件自动转换为dataset.
case class data(DEVICENAME: String, LID: BigInt,ADDRESS:String,ID:BigInt) session.read.option("encoded", "utf-8").json(path).as[data]
下面这种写法就会报错
class data(DEVICENAME: String, LID: BigInt,ADDRESS:String,ID:BigInt) session.read.option("encoded", "utf-8").json(path).as[data2]
抽象类
scala的抽象类跟java类似。只能定义方法体,没有实现。只能定义var类型的变量,不能定义val类型的变量。因为val类型的变量,子类无法重写。
abstract class PointAbstrct (x:Int) { var x : Int def add(x:Int) }
特征
scala的特征有点类似于java的接口,但它又可以有方法的实现。这有点类似抽象类,可它跟scala的抽象类相比,它不能定义构造函数。一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
对象
对于class类,通过new可以得到类的对象。对于case class可通过apply直接使用类对象。还可以直接创建一个object对象。
scala中没有静态的修饰符,但object类中的全都是静态成员。在object类中可以直接定义入口函数main。可以直接调用访问级别允许的变量及函数。
伴生对象
当一个object对象与一个class类名称相同且object与class在同一个源文件时,我们称object为class的伴生对象。同时,class也被称为object的伴生类。object和class可以互相访问对方的私有属性。
class applyclass { private val name : String = "" object applyclass{ //初始化 } }
java
public class applyclass{ static{ //初始化 } }
前面讲到case class的时候,case class得到一个对象不需要new。
- 编译器会为Case Class自动生成伴生对象
-
编译器会为伴生对象自动生成以下方法
- apply
- unapply
所以:
case class data(DEVICENAME: String, LID: BigInt,ADDRESS:String,ID:BigInt) val data2 = data.apply("test", 0, "test2", 0) val option = data.unapply(data2).getOrElse("")
伴生类通过apply得到实例对象,通过unapply传入一个对象得到,从中取值。
单例对象
class Scala private{//private的构造函数 def add() = 0 } object Scala{//在伴生对象中得到类的实例,并向外部暴露 val scala = new Scala } object test{ def main(args: Array[String]): Unit = { val scala = new Scala//异常 Scala.scala.add() } }
以上是关于spark快速开发之scala基础之3类,对象,特征的主要内容,如果未能解决你的问题,请参考以下文章
大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池