在实际开发中,一般对于类权限使用public,对于方法权限使用最多的是public,private,
对于属性权限使用最多的是private,或者默认权限。使用以上权限,对于代码访问
一般足够使用。很少使用protected权限。
(注意: 关于protected权限只能使用于方法或属性上,在类上是没有这个权限的,不能用于类上)。
有些特殊情况下我们需要使用protected,比如,父类提供了一个方法,不想让其他包中的
对象访问,只想让自己所在包中的类访问,这个时候如果我们用public和private是满足不了
这种需求的,这个时候protected权限就派上了用场。
eg:
在test包中有两个类,一个Parent,一个Children
Parent:
package com.lanhuigu.java.test; public class Parent { // protected在本包中可以访问,如果跨包就不能访问 protected String song() { return "唱歌"; } }
Children:
package com.lanhuigu.java.test; public class Children extends Parent{ // 子类重写父类的方法,扩大访问权限 public String song() { return "唱歌"; } public String code() { return "编码"; } }
Test:
package com.lanhuigu.java.util; import com.lanhuigu.java.test.Children; import com.lanhuigu.java.test.Parent; public class TestAccess { public static void main(String[] args) { Parent parent = new Parent(); /* * Parent中的song方法是protected权限,其他包中没有访问权限 */ //System.out.println(parent.song()); System.out.println("================="); Children children = new Children(); System.out.println(children.code()); /* * 子类通过重写父类的song方法,将父类的访问权限protected提升至public的高度, * 供其他包中的类调用,如果子类不重写父类的song方法,提高访问权限,其他包中的类通过 * 子类对象也是无法访问song方法的,因为没有提高访问权限之前song方法是protected权限的。 */ System.out.println(children.song()); } }
程序分析:
在test包中,Parent类song方法访问权限为protected权限,子类Children继承父类,
重写父类Parent的song方法,将访问权限提高到public程度,在TestAccess中,
通过父类对象Parent不能访问父类protected权限的song方法,因为TestAccess类在util包中,
与Parent不在同一包中,所以不能访问;但是可以通过子类Children对象访问song方法,因为
子类重写了父类的song方法,提升了访问权限。
为什么protected权限叫做'友好'权限?
就好比一个家族中某个人升官发财,有好处一般都是给这个家族中共享,
一般不会把好处给了外人,但是世间还是有真情的,家族中某些人将这些好处从protected
保护的状态提升到public公开的状态,这样其他家族都能共享了,这就是友好的含义。
在java中,比如A包就一个家族,在A包中protected的东西大家都能用,
但是对于另外一个包B就是外人,直接看不到A中的protected的东西。
如果B包想用A包的protected东西,必然有A包中某个类将protected的东西
提升到public的程度,B包才能使用。