zoukankan      html  css  js  c++  java
  • 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。

    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()
      }
    }
  • 相关阅读:
    Django rest framework集成微博第三方登录
    Python web项目Django部署在Ubuntu18.04腾讯云主机上
    Mac中安装JDK1.8和JDK11双版本并任意切换
    Nginx完美解决前后端分离端口号不同导致的跨域问题
    Mac系统安装Tomcat服务器
    Python将数据渲染到docx文档指定位置
    IO多路复用select/poll/epoll详解以及在Python中的应用
    Tornado框架实现异步爬虫
    广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)
    Python3使用tkinter编写GUI程序
  • 原文地址:https://www.cnblogs.com/eryuan/p/7326606.html
Copyright © 2011-2022 走看看