面向对象编程OOP:
  Scala vs Java 都有这三特性
    封装:把属性、方法封装到类中
      Person:
        int id, String name, Date birthday.... 需要getter/setter
        eat、sleep....
    

    继承:父类和子类之间的关系 override重写
      User extends Person
      exam...... //即可以继承别的类,也可以有自己的属性

    多态:*****级别,父类引用指向子类对象 精髓所在 开发框架的基石。
      Person person = new Person();
      User user = new User();
      Person person = new User();

类的定义和使用:

object SimpleObjectApp {
  def main(args: Array[String]): Unit = {
    val perosn = new People();
    person.name = "Messi"
    println(person.name + " .. " + person.age)

    person.printInfo()
  }
}

定义一个类:
class People {
  //定义属性
  var name:String = ""
  val age:Int = 10

  private [this] val gender = "male"   //private 表示只在本类里生效,出了本类就失败。

  def printInfo(): Unit = {
    println("gender:" + gender)
  }

  //定义方法
  def eat():String = {
    name + "eat..."
  }

  def watchFootball(teamName: String): Unit = {
    println(name + "is watching match of " + teamName)
  }
}

构造器:

object ConstructorApp {
  def main(args: Array[String]): Unit = {
    val person = new Person("zhangsan", 30)
    println(person.name + " : " + person.age + " : " + "person.school")

    val person2 = new Person("lisi", 18, "M")
    println(person2.name + " : " + person2.age + " : " + "person2.school" + " : " + person2.gender)
  }
}

// 主构造器 (val name:String, val age:Int)
class Person(val name:String, val age:Int) {
  println("Person Constructor enter...." )

  val school = "ustc"
  var gender:String = _

  //附属构造器
  def this(name:String, age:Int, gender:String) {
    this(name,age) //附属构造器的第一行代码必须要调用主构造器或者其他附属构造器
    this.gender = gender
  }

  println("Person Constructor leave...." )
}

继承:
object ConstructorApp {
  def main(args: Array[String]): Unit = {
    val student = new Student("xiaochun", 18, "Math")
    println(student.name + " : " + student.gender)
  }
}

class Student(name:String, age:Int, var major:String) extends Person(name,age) {    //extends 关键字,继承。
  println("Person Student enter...." )

  println("Person Student leave...." )
}

注意:当我们子类去继承父类的时候,如果父类有的属性,子类不用写val或var。例如上面的name:String和age:Int。 但是major:String参数是父类里没有的,所以必须写var或val。

重写:
  使用override可以对子类继承父类的属性或者方法改写的。

  比如修改上面的学校名:必须加override关键字

  override val school = "peking"

  override def toString: String = "Person: override def toString :" + school

抽象类:
  如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现不同的方法。

  此时,可以将父类中的这些方法编写成只含有方法签名,不含方法体的形式,这种形式就叫做抽象方法。

  一个类中,如果含有一个抽象方法或抽象field,就必须使用abstract将类声明为抽象类,该类是不可以被实例化的;在子类中覆盖抽象类的抽象方法时,可以不加override关键字。

object AbstractApp {
  def main(args: Array[String]): Unit = {
    val student = new Student2()
    println(student.name)
    student.speak
  }
}

/**
  * 类的一个或者多个方法没有完整的实现 (只有定义,没有实现)
  */

//抽象类
abstract class Person2 {

  //抽象方法
  def speak

  //抽象字段
  val names:String
  val age:Int
}

//抽象类实现类
class Student2 extends Person2 {
  override def speak: Unit = {
    println("speak")
  }

  override val name: String = "xiaochun"
  override val age: Int = 18
}

伴生类和伴生对象:

object ApplyApp {

}

//伴生类和伴生对象: class ApplyTest是object ApplyTest的伴生类,反之object ApplyTest是 class ApplyTest的伴生对象。两个是同名的。
class ApplyTest{

}

object ApplyTest{

}

apply方法:

object ApplyApp {
  def main(args: Array[String]): Unit = {
    for(i <- 1 to 10) {
      ApplyTest.incr
    }

    println(ApplyTest.count) //10 说明object本身就是一个单例对象

    var b = ApplyTest() // ==> 这句话调用的是Object里的apply方法
    println("~~~~~~~~")
    var c = new ApplyTest() // ==> 这句话调用的是class里的apply方法
    println(c)
    c()

    //类名() ==> Object.apply
    //对象() ==> Class.apply
  }
}

class ApplyTest{
  def apply() = {
    println("class ApplyTest apply....")
  }
}

object ApplyTest{
  println("Object ApplyTest enter....")
  var count = 0
  def incr = {
    count = count + 1
  }

  //最佳实践: 在Object的apply方法中去new Class
  def apply() = {
    println("Object ApplyTest apply....")
    //在object中的apply中new class
    new ApplyTest
  }
  println("Object ApplyTest leave....")
}

case class:

//通常用在模式匹配里面
object CaseClassApp {
  def main(args: Array[String]): Unit = {
    println(Dog("wangcai").name)
  }
}

//case class 不用new,直接使用就行。
case class Dog(name:String)

trait: xxx extends Atrait with BTrait
class SparkConf(loadDefaults: Boolean)
  extends Cloneable
  with Logging
  with Serializable
  ...
  ...
//这两个with的东西都是用 trait Logging和 trait Serializable

trait Partition extends Serializable {
  def index: Int
  override def hashCode(): Int = index
  override def equals(other: Any): Boolean = super.equals(other)
}

Scala面向对象的更多相关文章

  1. Spark 3000门徒第二课scala面向对象总结

    昨晚听了王家林老师3000门徒spark系列课程的第二课,讲述了scala面向对象知识,并且带着过了一遍Spark核心类:SparkContent,RDD的代码,下面写一下心得: RDD是抽象类,实现 ...

  2. scala 面向对象之 继承

    scala 面向对象之 继承 scala   1.extends Scala中,让子类继承父类,与Java一样,也是使用extends关键字 继承就代表,子类可以从父类继承父类的field和metho ...

  3. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  4. Scala面向对象编程与类型系统

    Scala支持面向对象编程, 其面向对象特性与Java有共同之处并添加了很多新的特性. 类定义 scala使用class关键字定义类: class MyComplex(real0:Double, im ...

  5. Scala面向对象和模式匹配

    我们要封装数据,定义模板等操作,所以我们需要面向对象. 一.scala中的单例对象 在scala当中,是没有static的,scala给我们提供了单例模式的实现方法.就是使用关键字object. st ...

  6. Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析

    /** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...

  7. Scala——面向对象和函数式编程语言

    Scala Scala是一门运行时基于JVM的编程语言,具备函数式编程和面向对象特点. 基本知识 basics 任意词均可作为符号名,对于关键词,以反引号包裹,避免使用下划线,避免带美元符的名字. 声 ...

  8. 8. Scala面向对象编程(高级部分)

    8.1 静态属性和静态方法 8.1.1 静态属性-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 8.1.2 基本介绍 -Sca ...

  9. 7. Scala面向对象编程(中级部分)

    7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...

  10. 大数据笔记(二十四)——Scala面向对象编程实例

    ===================== Scala语言的面向对象编程 ======================== 一.面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 c ...

随机推荐

  1. python基础面试题:(1)

    1.以下用C语言开发的Python解释器是( ) A:python是Java语言开发的Python解析器,B:PyPy是使用Python语言开发的Python解析,C:IronPython是.net平 ...

  2. NancyFx 2.0的开源框架的使用-ConstraintRouting

    新建一个空的Web项目 然后在Nuget库中安装下面两个包 Nancy Nancy.Hosting.Aspnet 然后在根目录添加三个文件夹,分别是models,Module,Views 然后往Mod ...

  3. JVM垃圾回收算法图解

    参考文档:https://www.toutiao.com/a6691966641242112516/ 垃圾搜集算法 标记-清除法 标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进 ...

  4. Maven生成可以直接运行的jar包的多种方式(转)

    转自:https://blog.csdn.net/xiao__gui/article/details/47341385 Maven可以使用mvn package指令对项目进行打包,如果使用java - ...

  5. OGG-01161

    Bad column index (35) specified for table user.table_name, max columns = 35. 原因:源端表结构发生了变更 解决办法:1.如果 ...

  6. 2018-10-16-weekly

    Algorithm 判断子序列 What 给定字符串 s 和 t ,判断 s 是否为 t 的子序列.如,"ace"是"abcde"的一个子序列,而"a ...

  7. git点滴

    git指定版本,SHA-1短的,长的都可以 git checkout c66a9be git checkout c66a9befsadf1sdf1s3fd21 git log ##查询本地log gi ...

  8. Django2 + python3 上传图片

    . ├── db.sqlite3 ├── manage.py ├── myImg │   ├── __init__.py │   ├── __pycache__ │   │   ├── __init_ ...

  9. 第四章 QML语法

    4.1 语法基础 import QtQuick 2.6 import QtQuick.Window 2.2 Rectangle { width: 400 height: 400 color: &quo ...

  10. 又联考了一场,感觉自己好菜啊,T2推出了公式但是不会逆元QAQ,难受啊!!!不过都确实是一道逆元的好题撒!

    简单的玄学(random) 题目描述: 样例输入: 样例1: 3 2 样例2: 1 3 样例3: 4 3 样例输出: 样例1: 1 8 样例2: 1 1 样例3: 23 128 提示: 时间限制:10 ...