• 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类不可见,因此编译错误;

    !!!

     
     
  • 相关阅读:
    [C语言] 时间操作,把1970年开始秒数计算的时间,转换为字符串格式输出;
    [C语言] 文件操作,解压华为官方固件UNDATE.APP工具(源代码);
    [Linux] 批量转换整个目录下的文件编码为UTF8;
    [C语言] 文件操作,解压SZB格式中的一段函数片段;
    [Android] patchrom的随笔(个人运行记录..);
    App Store 申请经验 完整的IDP申请直到软件上架
    timer
    终于弄明白iPad UIPopoverController弹出窗口的位置和坐标了
    UIPopoverController的使用
    iPhone开发的一些小技巧
  • 原文地址:https://www.cnblogs.com/SuperZDK/p/13976917.html
Copyright © 2020-2023  润新知