在设计程序时,为达到一个复杂的目的,需要设计多个类,有时会遇到一个类和另一个类共同合作、互相调用对方的方法这种情况。我们想让类的某些方法只是为指定的类准备,而不允许其他类访问,该如何解决呢?
通常按照我们一般的面向对象的思维,学过c++面向对象的,我们会想到用友联函数,通过修饰类成员方法为友联,来直接达到目的:指定另一个类有权限能够访问这个方法。但对于其他类来说,这个方法是隐藏、不可视、不可访问的,即没有权限。
这在c++里是没有问题的。
那么java里有没有友联这个概念呢?
答案是有的,确实为这种问题设计有解决方法。
不过在java中,友联的概念的实现,不是靠c++的声明友联函数的路子实现,而是另一种不同的路子:
我们可以回忆下最初我们学习的四大java权限访问修饰符,有哪些呢?按照开放程度高低依次为:public default protected private
这四个中,有哪些是跨类权限(跨类权限即允许类外的其他类访问)呢?
有两个,一个是public,一个是default 。这两个权限中,如果我们把类修饰成public,那么任何类都可以访问了,而我们的目的是让修饰的方法只有指定类可以访问。那么看default,default权限的定义是,只允许同包下的类访问。这个特性就可以满足我们这个问题的需求,只要我们把方法修饰成default(不加任何修饰符就是default),然后把需要指定类才能访问它的类给放到同包目录下,就可以实现对这些类可视、可访问,而对外(对包外的类)隐藏。
剩下两个修饰符,protected是只允许自己类和子类的权限;private是只允许自己类的权限。
这两个修饰符都是局限在类内部的,无法使得与类外的其他类联系。
很多新手程序员刚学习java,很少用default这个修饰符,基本就是private+public两个修饰符写不停,可以说它是用的最少的一个修饰符了,这里想说的是,在以后开始遇到这种情况起,就要恰当地采用default修饰符了。
技术总结:在Java中面向对象设计中,要想实现友联,依赖权限修饰符default,利用同包可访问的特性,来实现成员友联。
抽象概念的简单实体化理解:
一个公司(包)里,员工之间是有信任关系的(虽然现实中信任程度有限),他们需要共同协作完成任务,所以他们的有些资源可以在团队内部共享,有些人的方法可以被团队内部的其他人调用。这些属于团队内部资源,而这些资源对外其他人保密、不授权。
因此在设计类时,如果出现了多个类存在依存关系,它们互相不可或缺,需要共同协作完成任务时,可以视为它们是一体的团队,把他们放在一个包下(为这些人开了个公司~),并将团队内部资源修饰为default,就可以实现团队内部工作和对外工作两不误的兼容美象。
这告诉了我们,解决问题除了每个人都靠个人外,还要学会团队合作~
还告诉我们,同处于一屋檐下的人,基本上算是朋友了吧(友联),你们之间是可以合作的,因为你们都有共同之处才处在同一个层次里。