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类,对象,特征的更多相关文章
- spark快速开发之scala基础之1 数据类型与容器
写在前面 面向java开发者.实际上,具有java基础学习scala是很容易.java也可以开发spark,并不比scala开发的spark程序慢.但学习scala可有助于更快更好的理解spark.比 ...
- spark快速开发之scala基础之5高阶函数,偏函数,闭包
高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...
- spark快速开发之scala基础之2控制流程
判断结构 大体与java相当.scala没有三元表达式. val num = if(1>0) 1 else 0 //相当于匿名函数 println(num) var num2 = 0 if(1& ...
- Android Studio快速开发之道
概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...
- iOS 开发之 GCD 基础
header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...
- ArcGIS Engine开发之旅08--和查询相关的对象和接口
原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...
- android开发之 Wifi的四个类
android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...
- ios开发之OC基础-类和对象
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- ios开发之OC基础-oc小程序
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
随机推荐
- 《算法》第六章部分程序 part 8
▶ 书中第六章部分程序,加上自己补充的代码,包括单纯形法求解线性规划问题 ● 单纯形法求解线性规划问题 // 表上作业法,I 为单位阵,y 为对偶变量,z 为目标函数值 // n m 1 // ┌── ...
- CentOS修改locale解决调用API乱码问题
查看所有的locale语言 locale 查看当前操作系统使用的语言 echo $LANG 永久设置系统locale语言 vi /etc/profile LANG="zh_CN.UTF-8& ...
- JUC 之 ThreadPoolExecutor 的一些研究
ThreadPoolExecutor 概述:===================================================================== 构造函数: 4个 ...
- HTTP 416
真是活久见, 竟然遇到了HTTP 416 参照 http://baike.baidu.com/view/1790469.htm , Requested Range Not Satisfiable 如果 ...
- poi excel超出65536行数限制自动扩展Invalid row number (65536) outside allow
1.xls一个sheet只能装65536行,多余则报错 poi包导出或写入excel超出65536报错: java.lang.IllegalArgumentException: Invalid row ...
- MongoDB 全部笔记
1. MongoDB: 是NOSQL的一种, 特长是分布式用的,用于处理爬虫数据 2. mongoDB 与 redis mongoDB是最像关系型的非关系型数据,更加适用于大数据,redis则更倾向于 ...
- 页面中href链接的碰撞
问题: 如上图动态生成一个li列表,点击之后页面直接全部刷新了一遍 原因: 动态生成的代码(第一个图)中href链接地址与顶部页面(上图)中固定的href链接存在冲突 如果动态生成的列表指定的链接名称 ...
- Python 百分号字符串拼接
# %s可以接收一切 %d只能接收数字 msg = 'i am %s my hobby is %s' %('lhf','alex') print msg msg2 = 'i am %s my hobb ...
- 算法练习,链表二分最大n个
import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; public class Bin ...
- dependencies与dependencyManagement的区别
1.DepencyManagement应用场景 当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行 ...