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里面的东西
同样,因为object Test1里面都是静态的,所以不能直接访问非静态的东西,所以访问 class Test1要这么写:
其他的一些关注点:---和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吗?---因为概念是静态的,所以不能
最后对整段测试代码
进行字节码分析,以便更好的理解: