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()
      }
    }
  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/eryuan/p/7326606.html
Copyright © 2011-2022 走看看