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。

  1. 编译器会为Case Class自动生成伴生对象
  2. 编译器会为伴生对象自动生成以下方法

    • 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类,对象,特征的更多相关文章

  1. spark快速开发之scala基础之1 数据类型与容器

    写在前面 面向java开发者.实际上,具有java基础学习scala是很容易.java也可以开发spark,并不比scala开发的spark程序慢.但学习scala可有助于更快更好的理解spark.比 ...

  2. spark快速开发之scala基础之5高阶函数,偏函数,闭包

    高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...

  3. spark快速开发之scala基础之2控制流程

    判断结构 大体与java相当.scala没有三元表达式. val num = if(1>0) 1 else 0 //相当于匿名函数 println(num) var num2 = 0 if(1& ...

  4. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

  5. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. ArcGIS Engine开发之旅08--和查询相关的对象和接口

    原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...

  7. android开发之 Wifi的四个类

    android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...

  8. ios开发之OC基础-类和对象

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  9. ios开发之OC基础-oc小程序

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

随机推荐

  1. SLD Related Gateway Serivces Unavaliable

    SAP NW 7.4 default switched on the ACL (access control list) in gateway service, so only local acces ...

  2. python 日期创建dir

  3. 新装Windows Server 2008 R2的设置

    原文链接:https://www.kafan.cn/edu/2898054.html 1.2008设置自动登录 具体方法:开始→运行→输入“rundll32 netplwiz.dll,UsersRun ...

  4. Linux系统Oracle启动、关闭

    Linux系统启动Oracle命令 su - oracle sqlplus /nolog conn / as sysdba startup exit lsnrctl start exit Linux系 ...

  5. hdfs线上修改 nameserivce

    hdfs线上修改 nameserivce(ns1 修改为 ns2) 1.去core-site.xml.hdfs-site.xml 把ns1 -> ns2 同步所有节点 2.去journal 数据 ...

  6. shell doc

    参考: http://c.biancheng.net/view/1114.html

  7. leetcode970

    public class Solution { public IList<int> PowerfulIntegers(int x, int y, int bound) { var list ...

  8. python内置函数使用

    print(abs(1)) #绝对值,正数就是自己 ",''])) #计算可迭代对象中是否为真,其中一个为假,就显示为假 print(all('')) # If the iterable i ...

  9. react-native 相对项目路径导入组件

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...

  10. go遍历某个文件夹

    //遍历文件夹 dir, err := ioutil.ReadDir("./upload_tmp")for _,file := range dir{ logs.Debug(file ...