Java的protect修饰限制

1. 简介

对protected修饰符进行阐述,结合Object类的clone方法进行说明。其中clone方法如下:protected Object Object.clone();

关于protected修饰符的访问权限如下:

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;

  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,子类不能访问基类实例的protected方法。

2. 示例

2.1 示例1

复制代码
 1 package modify.pack1;
 2 public class FaObject1 {
 3     protected void sp(){
 4         System.out.println("father method");
 5     }
 6 }
 7 
 8 
 9 package modify.pack1;
10 public class SonObject1 extends FaObject1{
11     public static void main(String[] args){
12 
13         SonObject1 sb1 = new SonObject1();
14         sb1.sp();          //  (1)
15 
16         FaObject1 fb = new FaObject1();
17         fb.sp();          //   (2)
18     }
19 }
20 
21 
22 package modify.pack2;
23 import modify.pack1.FaObject1;
24 public class SonObject2 extends FaObject1 {
25     public static void main(String[] args){
26 
27         SonObject2 sb2 = new SonObject2();
28         sb2.sp();             //  (3)
29 
30         FaObject1 fb = new FaObject1();
31 //        fb.sp();            //  (4)编译错误
32     }
33 }
34 
35 
36 package modify.pack2;
37 import modify.pack1.FaObject1;
38 public class UnrelatedObject {
39     public static void main(String[] args){
40         
41         FaObject1 fb = new FaObject1();
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 package modify.pack3;
 2 public class FaObject3 {
 3     public static void main(String[] args){
 4 
 5         FaObject3 fb3 = new FaObject3();
 6         try {
 7             fb3.clone();      // (1)
 8         }
 9         catch (CloneNotSupportedException e) {
10             e.printStackTrace();
11         }
12 
13         SonObject3 sb3 = new SonObject3();
14         try {
15             sb3.clone();      // (2)
16         }
17         catch (CloneNotSupportedException e) {
18             e.printStackTrace();
19         }
20     }
21 }
22 
23 
24 package modify.pack3;
25 public class SonObject3 extends FaObject3{
26     public static void main(String[] args){
27 
28         SonObject3 sb3 = new SonObject3();
29         try {
30             sb32.clone();      // (3)
31         }
32         catch (CloneNotSupportedException e) {
33             e.printStackTrace();
34         }
35 
36         FaObject3 fb3 = new FaObject3();
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类不可见,因此编译错误;

!!!

 
 
原文地址:https://www.cnblogs.com/SuperZDK/p/13976917.html