• 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#中的赋值运算符及其运算规则
    值类型与引用类型
    变量的作用域和生存周期
    Eclipse 和 Vim 协同使用使用Eclim插件开发Python程序
    使用合适的设计模式一步步优化前端代码
    Vue.js 服务端渲染业务入门实践
    翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
    翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》 第 7 章: 闭包 vs 对象
    翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
    微信小程序教学第四章第二节(含视频):小程序中级实战教程:详情视图渲染
  • 原文地址:https://www.cnblogs.com/SuperZDK/p/13976917.html
Copyright © 2020-2023  润新知