scala面向对象

封装、继承、多态 其实不是面向对象的核心特征,只是语法层面的支撑。

面向对象的核心特征:

1.对象不用关心消息的来源和去向,只关心消息本身,即对象是弱耦合的、消息驱动的

2.一个对象的行为不影响另外一个对象的行为

3.面向接口编程


函数和方法的区别:
函数不依赖类,方法依赖于类


过程:

方法没有返回值


package com.sparktest

/**
  * 1.scala中定义类是用class关键字;
  * 2.可以使用new ClassName的方式构建出类的对象
  * 3.如果名称相同,则object中的内容都是class的静态内容,也就是说object中的内容class都可以在没有实例的时候直接去调用,
  * 正是因为可以在没有类的实例的时候去调用object中的一切内容,所以可以使用object中的特定方法来创建类的实例,这个特定
  * 的方法就是apply方法
  * 4.object中的apply方式是class对象生成的工厂方法,用于控制对象的生成
  * 5.很多框架的代码一般直接调用抽象类的objectapply方法去生成类的实例对象:
  * 1apply具有类的对象生成的一切生杀大权,抽象类是不可以直接实例化的,在apply方法中可以实例化抽象类的子类,以Spark中的图计算
  * 为例,Graph是抽象的class,object Graph中的apply方法实际上是调用了Graph的子类GraphImpl来构建Graph类型的对象实例的,从Spark
  * 图计算的源码可以看出,GraphImpl的构造也是使用了object GraphImplapply方法
  * 2)这种方式更加能够应对代码版本迭代(修改)的变化,这是更高意义的面向接口编程
  * 6.object HelloOOPclass HelloOOP的伴生对象,class HelloOOP可以直接访问object HelloOOP中的一切内容,而class HelloOOP
  * object HelloOOP的伴生类,object HelloOOP可以直接访问class HelloOOP的一切内容,一个特例是用private[this]修饰的成员
  * 7.在定义scalaclass的时候,可以直接在类名后面()加入类的构造参数,此时在apply()中也必须有该参数
  * 8.scala中可以在object中构建很多apply()
  * 9.scala中的很多集合都是使用apply的方式构造的,例如:Array
  */

class HelloOOP(age: Int) {
  val name = "Spark"

  def sayHello = println {
    "Hi,My name is " + name + "I'm " + age + "years old!"
  }
}

object HelloOOP {
  var number = 0

  def main(args: Array[String]): Unit = {

    println("Hello OOP!")

    //val helloOOP = new HelloOOP
    //val helloOOP = HelloOOP(10)
    val helloOOP = HelloOOP()
    helloOOP.sayHello
  }

  def apply(age:Int): HelloOOP = {
    println("My name is " + number)
    number += 1
    new HelloOOP(age)
  }
  def apply(): HelloOOP = {
    println("My name is " + number)
    number += 1
    new HelloOOP(10)
  }
}

你可能感兴趣的:(Scala)