面向对象的核心并不是“封装”、“继承“、”多态“,它们只不过是支撑面向对象语言的语法和功能
面向对象的三个核心是:
1、对象本身并不关注消息从哪里来,要到哪里去,它只关心消息的处理本身,且对象是弱耦合的,是由消息与数据驱动的
2、一个对象的行为不影响另一个对象的行为,也就是说一个对象挂掉了,其他对象依然正常执行
3、面向接口编程是为了封装实现业务的不同而具体的细化
所以,java、scala等不是面向对象的语言而是支持面向对象开发的语言,他们有封装、继承、多态的核心及特点。
1、在Scala中定义类是用
class关键字
2、可以使用new className 的方式构建出类的对象
3、在scala文件中 object关键字修饰的与类名相同的对象中的内容都是class中的静态内容,也就是说object的函数、成员等在对象没有被实例化的情况下直接可以通过类名直接调用,正是因为在没有类的实例化的情况下可以调用object的内容,所以可以使用object中的特定方法来创建类实例,而这个方法就是apply方法
4、object中的apply方法时class对象生成的工厂方法,用于控制对象的实例化
5、很多框架的代码使用抽象类的object的apply方法实例化对象
(1)、其秘诀在于apply具有类对象实例化的生杀大权,抽象类是不可以直接实例化的,但在apply方法中可以实例化抽象类的子类
(2)、这种方式的神奇地方在于更加能够应对代码版本迭代或修改的变化,这是更高意义的面向接口编程
6、object HelloOOP 是class HelloOOP 的半生对象,
class HelloOOP中可以访问object HelloOOP中所有的内容,class HelloOOP是object HelloOOP的伴生对象,object HelloOOP也可以访问class HelloOOP中的所有内容
7、在定义scala的类的时候可以直接在class 的后面的()中加入构造参数,此时object中的apply方法也需要有同样的构造参数
8、scala中可以在object中可以构造很多apply方法
9、scala中的很多集合都是通过apply的方式构造的,例如:Array
注:
1、函数本身是独立的,跟类没什么关系,
2、Spark的图计算非常非常简单,没几行代码(微信、淘宝、百度地图等都用到了图计算)