package Basic
/**
* 面向对象的三大精髓:
* 1、对象不用关心消息从哪里来,到哪里去,只需要关心消息(或数据)的处理本身。
对象是弱耦合的,它是消息驱动的,或者说是数据驱动的。
2、一个对象的行为不影响另一个对象的行为。比如,一个对象挂掉了,另一个对象不可能也随之挂掉。
3、面向接口编程,为了封装具体实现的不同和业务的变化。
=====================================================================
* 1、在Scala中定义类是用class关键字
* 2、可以使用new ClassName的方式构建出类的对象
* 3、如果名称相同,则object中的内容都是class的静态内容,也就是说object中的内容class都可以在没有实例的时候直接去调用;
* 正是因为可以在没有类的实例的时候去调用object中的一切内容,所以可以使用object中的特定方法来创建类的实例,这个特定方法就是apply方法
* 4、object中的apply方法是class对象生成的工厂方法,用于控制对象的生成。
* 5、很多框架的代码 一般直接调用抽象类的object的apply()方法去生成类的实例对象:
* 第一,其秘诀在于apply具有类的对象生成的一切生杀大权,抽象类是不可以直接实例化的,在apply方法中可以实例化抽象类的子类,
* 以Spark中的图计算为例,Graph是抽象的class,在object Graph中的apply方法实际上是调用了Graph的子类GraphImpl来构
* 建Graph类型的对象实例的,当然从Spark图计算的源码可以看出,GraphImpl的构造也是使用了object GraphImpl的apply方法;
* 第二,这种方式神奇的效应在于更加能够应对代表版本迭代或者修改的变化,这是更高意义的面向接口编程;
* 6、object HelloOOP2是class HelloOOP2的伴生对象,class HelloOOP2是可以直接访问object HelloOOP2中的一切内容;
* 而class HelloOOP2是object HelloOOP2的伴生类,object HelloOOP2可以直接访问class HelloOOP2的一切内容,但是,
* 其中有一个特例 ,就是用private[this]修饰的成员。
* 7、在定义Scala的class的时候可以直接在类名后面()里加入类的构造参数,此时在apply方法中也必须有这些参数。
* 8、Scala中可以在object中构造很多apply方法
* 9、Scala中的很多集合都是使用apply的方式构造的,例如Array:
def apply[T: ClassTag](xs: T*): Array[T] = {
val array = new Array[T](xs.length)
var i = 0
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
*/
class HelloOOP2(age:Int){
var name="Spark"
def sayHello=println("Hi,My name is "+name+", My age is "+age+" years old!")
}
//此处的object是关键字,不是类的实例,切记!!!
object HelloOOP2 {
var number=0
val array=Array(1,2,3,4,5)
def main(args: Array[String]): Unit = {
println("Hello Scala OOP!")
// val helloOOP=new HelloOOP2
val helloOOP2=HelloOOP2(30) //调用有参的apply()方法千万不要漏掉小括号()!!!
helloOOP2.sayHello
HelloOOP2() //调用无参的apply()方法
// HelloOOP2()
// HelloOOP2()
// HelloOOP2()
// HelloOOP2()
}
def apply():HelloOOP2={
println("My number is: "+number)
number += 1 //注意:Scala中没有++、--这两个符号
println("My number is: "+number)
new HelloOOP2(10)
}
def apply(age:Int):HelloOOP2={
println("My number is: "+number)
number += 1 //注意:Scala中没有++、--这两个符号
println("My number is: "+number)
new HelloOOP2(age)
}
}
/**
* 面向对象的三大精髓:
* 1、对象不用关心消息从哪里来,到哪里去,只需要关心消息(或数据)的处理本身。
对象是弱耦合的,它是消息驱动的,或者说是数据驱动的。
2、一个对象的行为不影响另一个对象的行为。比如,一个对象挂掉了,另一个对象不可能也随之挂掉。
3、面向接口编程,为了封装具体实现的不同和业务的变化。
=====================================================================
* 1、在Scala中定义类是用class关键字
* 2、可以使用new ClassName的方式构建出类的对象
* 3、如果名称相同,则object中的内容都是class的静态内容,也就是说object中的内容class都可以在没有实例的时候直接去调用;
* 正是因为可以在没有类的实例的时候去调用object中的一切内容,所以可以使用object中的特定方法来创建类的实例,这个特定方法就是apply方法
* 4、object中的apply方法是class对象生成的工厂方法,用于控制对象的生成。
* 5、很多框架的代码 一般直接调用抽象类的object的apply()方法去生成类的实例对象:
* 第一,其秘诀在于apply具有类的对象生成的一切生杀大权,抽象类是不可以直接实例化的,在apply方法中可以实例化抽象类的子类,
* 以Spark中的图计算为例,Graph是抽象的class,在object Graph中的apply方法实际上是调用了Graph的子类GraphImpl来构
* 建Graph类型的对象实例的,当然从Spark图计算的源码可以看出,GraphImpl的构造也是使用了object GraphImpl的apply方法;
* 第二,这种方式神奇的效应在于更加能够应对代表版本迭代或者修改的变化,这是更高意义的面向接口编程;
* 6、object HelloOOP2是class HelloOOP2的伴生对象,class HelloOOP2是可以直接访问object HelloOOP2中的一切内容;
* 而class HelloOOP2是object HelloOOP2的伴生类,object HelloOOP2可以直接访问class HelloOOP2的一切内容,但是,
* 其中有一个特例 ,就是用private[this]修饰的成员。
* 7、在定义Scala的class的时候可以直接在类名后面()里加入类的构造参数,此时在apply方法中也必须有这些参数。
* 8、Scala中可以在object中构造很多apply方法
* 9、Scala中的很多集合都是使用apply的方式构造的,例如Array:
def apply[T: ClassTag](xs: T*): Array[T] = {
val array = new Array[T](xs.length)
var i = 0
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
*/
class HelloOOP2(age:Int){
var name="Spark"
def sayHello=println("Hi,My name is "+name+", My age is "+age+" years old!")
}
//此处的object是关键字,不是类的实例,切记!!!
object HelloOOP2 {
var number=0
val array=Array(1,2,3,4,5)
def main(args: Array[String]): Unit = {
println("Hello Scala OOP!")
// val helloOOP=new HelloOOP2
val helloOOP2=HelloOOP2(30) //调用有参的apply()方法千万不要漏掉小括号()!!!
helloOOP2.sayHello
HelloOOP2() //调用无参的apply()方法
// HelloOOP2()
// HelloOOP2()
// HelloOOP2()
// HelloOOP2()
}
def apply():HelloOOP2={
println("My number is: "+number)
number += 1 //注意:Scala中没有++、--这两个符号
println("My number is: "+number)
new HelloOOP2(10)
}
def apply(age:Int):HelloOOP2={
println("My number is: "+number)
number += 1 //注意:Scala中没有++、--这两个符号
println("My number is: "+number)
new HelloOOP2(age)
}
}