面向对象的三大特征:1.对象只需要关心消息处理本身,不需要关心消息哪里来,去哪里(也就是数据驱动)
2.一个对象的行为不会影响另外一个对象
3.面向接口编程
也就是说,Scala和Java都不是面向对象的语言,都只是支持面向对象的语言,用封装,继承,多态来支持者三大特征
函数:是独立的,不依赖于类的!!依赖于类的是方法!!
过程就是一个方法没有返回值
package com.dt.spark.scala.basics
/**
* 1.在Scala定义类是使用class关键字
* 2.可以使用new 类名 的方式构建出类的对象
* 3.如果名称相同,则object中的内容是class的静态内容,也就是说object中的内容,
* class都可以在没有实例的时候去调用,正是因为在没有类的实例的时候去调用object的一切内容,
* 所以可以使用object中的特定方法来创建类的实例,而这个特定方法就是apply方法
* 4.object中的apply方法是class对象生成的工厂方法,用于控制对象的生成
* 5.很多框架的代码,一般直接调用抽象类的object的apply方法来生成类的实例对象
* 第一:其秘诀在于apply具有类的对象生成的一切生杀大权,抽象类是不可以直接实例化的,
* 在apply方法中可以直接实例化抽象类的子类,以Spark的图计算为例,
* Graph是抽象类,在object Graph的apply方法中实际上是调用了Graph的子类
* GraphImpl来构建Graph的对象实例,当然从Spark的源码可以看出,GraphImpl的构造也是使用了
* object GraphImpl的apply方法
* 第二:这种方式神奇的效益在于更加能够应对代码版本迭代(修改)的变化,这是更高意义的面向接口编程
* 6.object HelloOOP是class HelloOOP的伴生对象,class HelloOOP可以直接访问object HelloOOP中的
* 一切内容,而class HelloOOP是object HelloOOP的伴生类,object HelloOOP可以直接访问class HelloOOP
* 中的一切内容,一个特例是private[this]修饰的内容,后面会特别去说明
* 7.在定义Scala的class的时候,可以直接在类名后面(age:Int),可以在括号里面加入类的构造参数
* 此时在apply方法中也必须有这些参数
* 8.scala中可以在object中构造很多apply方法
* 9.Scala中的集合很多都是使用apply方法构造的,例如:Array
* /** Creates an array of `Int` objects */
// Subject to a compiler optimization in Cleanup, see above.
def apply(x: Int, xs: Int*): Array[Int] = {
val array = new Array[Int](xs.length + 1)
array(0) = x
var i = 1
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
*
*/
class HelloOOP(age:Int){
var name="Spark"
def sayHello(){
println("Hello,"+name)
println("my age is:"+age)
}
}
object HelloOOP {
var number=0
def main(args:Array[String]){
println("Hello OOP")
val helloOOP=HelloOOP(20)
helloOOP.sayHello()
}
def apply(age:Int): HelloOOP = {
number += 1
println("my number is:"+number)
new HelloOOP(age)
}
def apply(): HelloOOP = {
number += 1
println("my number is:"+number)
new HelloOOP(10)
}
}
归纳总结:1.面向对象的三大特征
2.函数,方法和过程
3.object与class的关系,apply方法,使用apply方法的好处
4.Scala中类的构造方法,apply方法的重载
5.看看Array的构造