8.1 静态属性和静态方法
8.1.1 静态属性-提出问题
有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决
8.1.2 基本介绍
-Scala中静态的概念-伴生对象
Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象。这个类的所有静态内容都可以放置在它的伴生对象中声明和调用
8.1.3 伴生对象的快速入门
object boke_demo01 { def main(args: Array[String]): Unit = { println(ScalaPerson.sex) //true 在底层等价于 ScalaPerson$.MODULE$.sex() ScalaPerson.sayHi() //在底层等价于 ScalaPerson$.MODULE$.sayHi() } } //说明 //1. 当在同一个文件中,有 class ScalaPerson 和 object ScalaPerson //2. class ScalaPerson 称为伴生类,将非静态的内容写到该类中 //3. object ScalaPerson 称为伴生对象,将静态的内容写入到该对象(类) //4. class ScalaPerson 编译后底层生成 ScalaPerson类 ScalaPerson.class //5. object ScalaPerson 编译后底层生成 ScalaPerson$类 ScalaPerson$.class //6. 对于伴生对象的内容,我们可以直接通过 ScalaPerson.属性 或者方法 //伴生类 class ScalaPerson { // var name: String = _ } //伴生对象 object ScalaPerson { // var sex: Boolean = true def sayHi(): Unit = { println("object ScalaPerson sayHI~~") } }
-对快速入门的案例的源码分析
8.1.4 伴生对象的小结
1) Scala中伴生对象采用object关键字声明,伴生对象中声明的全是“静态”内容,可以通过伴生对象名称直接调用
2) 伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致
3) 伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问
4) 从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合
5) 从技术角度来讲,Scala还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类,实现属性和方法调用[反编译看源码]
6) 从底层原理看,伴生对象实现静态特性是依赖 public static final MOUDLE$ 实现的
7) 伴生对象的声明应该和伴生类的声明在同一个源码文件中(如果不在同一个文件中会运行错误),但是如果没有伴生类,也就没有所谓的伴生对象了,所以放在哪里就无所谓了
8) 如果 class A 独立存在,那么A就是一个类,如果 Object A 独立存在,那么A就是一个“静态”性质的对象[即类对象],在 Object A 中声明的属性和方法可以通过 A.属性和A.方法 来实现调用
9) 当一个文件中,存在半生类和伴生对象时,文件的图标会发生变化
8.1.5 最佳实践-使用伴生对象完成小孩堆雪人游戏
设计一个var total Int 表示总人数,我们在创建一个小孩时,就把total加1,并且total是所有对象共享的就ok了,使用伴生对象来解决
object boke_demo01 { def main(args: Array[String]): Unit = { //创建三个小孩 val child0 = new Child("铁蛋") val child1 = new Child("狗蛋") val child2 = new Child("熊大") Child.joinGame(child0) Child.joinGame(child1) Child.joinGame(child2) Child.showNum() } } class Child(cName: String) { var name = cName } object Child { //统计共有多少小孩的属性 var totalChildNum = 0 def joinGame(child: Child): Unit = { printf("%s 小孩加入了游戏\n", child.name) //totalChildNum 加1 totalChildNum += 1 } def showNum(): Unit = { printf("当前有%d小孩玩游戏\n", totalChildNum) } }
8.1.6 伴生对象-apply方法
在伴生对象中定义apply方法,可以实现:类名(参数)方式来创建对象实例
object boke_demo01 { def main(args: Array[String]): Unit = { val list = List(1, 2, 5) println(list) val pig = new Pig("狗蛋") //使用apply方法来创建对象 val pig2 = Pig("铁蛋") //自动 apply(pName: String) val pig3 = Pig() // 自动触发 apply() println("pig2.name=" + pig2.name) //小黑猪 println("pig3.name=" + pig3.name) //匿名猪猪 } } //案例演示apply方法. class Pig(pName: String) { var name: String = pName } object Pig { //编写一个apply def apply(pName: String): Pig = new Pig(pName) def apply(): Pig = new Pig("匿名") }
8.2 单例对象
这个部分将在Scala设计模式专题进行介绍
8.3 接口
8.3.1 回顾Java接口
-声明接口
interface接口名
-实现接口
class 类名 implements 接口1,接口2
-Java接口的使用小结
1) 在Java中,一个类可以实现多个接口
2) 在Java中,接口之间支持多继承
3) 接口中属性都是常量
4) 接口中的方法都试抽象的
8.3.2 Scala接口的介绍
1) 从面向对象来看,接口并不属于面向对象的范畴,Scala是纯面向对象的语言,在Scala中,没有接口
2) Scala语言