vlambda博客
学习文章列表

scala伴生类和伴生对象的理解

强行记忆用法非常容易忘记,希望能够结合设计者的思想,用逻辑和尽量少的记忆点来理解伴生类和伴生对象

 

 

之前在scala程序是如何启动的(https://mp.weixin.qq.com/s/TFaliBylkRxnaRQB_j7e1A)

中探讨了scala程序是怎么启动的,但是知其然不知其所以然,没有很好的从整体来掌握,无法对伴生类和伴生对象有清晰的概念(也就是知道a是什么,然后因为a是什么,然后基本了解a有什么没有什么,a什么能干什么不能干),

所以本文希望能够更清晰的理解伴生类和伴生对象.

 

想想scala设计者的思想:scala设计者认为类的属性和方法(静态方法和静态属性)不符合面向对象的思想,所以想用面向对象的思想来重新设计静态的东西,然后把一个类中静态和非静态的东西给拆分出来,尽量独立,让代码看起来更有条理

1.用一个东西来专门存放静态属性和方法:---- object出来了--里面都是静态的

2.class 类里面所有的方法和属性都是非静态的 ---class出来了

3.要保持java中静态属性和方法与原来类的关系 --- 伴生类/伴生对象的羁绊出来了

 

理解了设计思想很容易写出下面的程序程序:

如上图,由于object Test1里面所有的都是原来java的静态的概念,所以 在 class Test1自然可以像方法e一样,用类名.属性名/方法名来调用object Test1里面的东西

scala伴生类和伴生对象的理解


同样,因为object Test1里面都是静态的,所以不能直接访问非静态的东西,所以访问 class Test1要这么写

scala伴生类和伴生对象的理解

其他的一些关注点---和java一致

1.伴生对象是否可以访问其他类的属性---只要能new 就可以,是否能new就看访问权限了

2.伴生类可能否访问其他的object ---只要访问权限有就可以

3.那么访问权限的控制呢---如图这样加,object 和 class的访问权限控制应该是独立的?

这种试下就知道,和伴生类/伴生对象的思想没有关系

4.那么伴生类和伴生对象的关系在哪里?-----------综上分析,伴生类和伴生对象其实应该可以说拆分开了,所以就联系应该要比在java中的小的多

个人认为只要记住这一点

伴生类天生可以完全访问伴生对象的东西

(1.只有一个object的话也会生成一个伴生类,但是这个是隐藏的,不让人用的,所以这块就不要关注

 2.object的main函数的理解:参考

scala程序是如何启动的(https://mp.weixin.qq.com/s/TFaliBylkRxnaRQB_j7e1A)

这个其实也不是特别要关注,因为也是隐藏的

剩下时间,除非遇到啥特殊语法,否则把他们看成独立的东西就行


5.伴生对象 object 能够我们手动new---因为概念是静态的,所以不能


最后对整段测试代码

进行字节码分析,以便更好的理解: