1. 简介
对protected修饰符进行阐述,结合Object类的clone方法进行说明。其中clone方法如下:protected Object Object.clone();
关于protected修饰符的访问权限如下:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,子类不能访问基类实例的protected方法。
2. 示例
2.1 示例1
1 packagemodify.pack1;2 public classFaObject1 {3 protected voidsp(){4 System.out.println("father method");5 }6 }7
8
9 packagemodify.pack1;10 public class SonObject1 extendsFaObject1{11 public static voidmain(String[] args){12
13 SonObject1 sb1 = newSonObject1();14 sb1.sp(); //(1)
15
16 FaObject1 fb = newFaObject1();17 fb.sp(); //(2)
18 }19 }20
21
22 packagemodify.pack2;23 importmodify.pack1.FaObject1;24 public class SonObject2 extendsFaObject1 {25 public static voidmain(String[] args){26
27 SonObject2 sb2 = newSonObject2();28 sb2.sp(); //(3)
29
30 FaObject1 fb = newFaObject1();31 //fb.sp();//(4)编译错误
32 }33 }34
35
36 packagemodify.pack2;37 importmodify.pack1.FaObject1;38 public classUnrelatedObject {39 public static voidmain(String[] args){40
41 FaObject1 fb = newFaObject1();42 //fb.sp();//(5) 编译错误
43 }44 }
解释说明如下:
(1)FaObject1和SonObject1在同一个包内,子类实例可以访问自身继承的sp方法,编译通过;
(2)FaObject1和SonObject1在同一个包内,子类可以访问父类实例的sp方法,编译通过;
(3)FaObject1和SonObject2不在同一个包内,子类实例可以访问自身继承的sp方法,编译通过;
(4)FaObject1和SonObject2不在同一个包内,子类不可以访问父类实例的sp方法,编译错误;
(5)FaObject1和UnrelatedObject不在同一个包内,该类不可以访问其他类实例的protected方法,编译错误;
2.2 示例2
1 packagemodify.pack3;2 public classFaObject3 {3 public static voidmain(String[] args){4
5 FaObject3 fb3 = newFaObject3();6 try{7 fb3.clone(); //(1)
8 }9 catch(CloneNotSupportedException e) {10 e.printStackTrace();11 }12
13 SonObject3 sb3 = newSonObject3();14 try{15 sb3.clone(); //(2)
16 }17 catch(CloneNotSupportedException e) {18 e.printStackTrace();19 }20 }21 }22
23
24 packagemodify.pack3;25 public class SonObject3 extendsFaObject3{26 public static voidmain(String[] args){27
28 SonObject3 sb3 = newSonObject3();29 try{30 sb32.clone(); //(3)
31 }32 catch(CloneNotSupportedException e) {33 e.printStackTrace();34 }35
36 FaObject3 fb3 = newFaObject3();37 //fb3.clone();//(4) 编译错误
38 }39 }
(1)Object和FaObject3不在同一个包内,子类实例可以访问继承Object类的clone方法,编译通过;
(2)FaObject3和SonObject3在同一个包内,子类实例可以访问继承FaObject3类的clone方法,编译通过;
(3)FaObject3和SonObject3在同一个包内,子类实例可以访问继承FaObject3类的clone方法,编译通过;
(4)fb3的clone方法来自于Object类,该方法的可见性为java.lang包和Object类的FaObject3子类,对于SonObject3类不可见,因此编译错误;
!!!