修饰符protected的真正含义

引子

  • 我们都知道Object类中的clone方法是一个protected方法:
  protected native Object clone() throws CloneNotSupportedException;
复制代码
  • protected修饰符的含义:以前一直认为protected修饰的方法变量是对同一包和其子类可见的。

  • 疑惑:Object是所有类的父类,那么应该其他类都可以直接访问clone()方法,为什么结果不行呢?

  package com.txl;

  import com.example.Son;

  public class Test4 {
      public static void main(String[] args) throws CloneNotSupportedException {
          Son son = new Son();
          son.method1(5);
          son.clone();//编译报错:'clone()' has protected access in 'java.lang.Object'
      }
  }
复制代码

案例1:

  • 看1个案例:
  1. com.txl包下的Father类,其中有一个protected方法
    package com.txl;

    public class Father类{
        protected void method1(int a){
            System.out.println(a);
        }
    }
复制代码
  1. com.example包下的Son类继承Father类且和Father类不在同一个包下
  package com.example;

  import com.txl.Father;

  public class Son extends Father {
  }
复制代码
  1. com.example包下的Test5类。
  package com.example;

  public class Test5 {
      public static void main(String[] args) {
          Son son = new Son();
          son.method1();//编译报错:'method1(int)' has protected access in 
      }
  }
复制代码
  1. 现象
  • Father在com.txl包下, Son类和Test5类在com.example包下。Son继承了Father类,那么也继承了Father类中的protected方法method1(int a)。但是在com.example包下的Test5类中通过Son实例调用该方法时son.method1();却编译不通过。

  • 原因:当Test4类和protected方法所在类的包不在同一个包时,不能在一个子类Test4中访问另一个子类Son继承的protected方法。

  • 可以的情况:1. com.txl包下通过Son实例调用该方法,2. 或者在Son类里面调用该方法(此时在该类中调用,相当于直接调用继承的父类的protectd方法)。

  1. 可以调用protected方法的例子:
    1. 在Son类里面调用protected方法:注意此时父类Father是com.txl包,子类Son是com.example包,还是不在用一个包。
  package com.example;

  import com.txl.Father;

  public class Son extends Father {
      public static void main(String[] args) throws CloneNotSupportedException {
       	  new Son().method1(12);
          new Son().clone();
      }
  }
复制代码
    1. 在Father包下:可以在该包下的任意一个类中调用protected方法。此时protected修饰符相当于public
  • 注意:在com.txl;包下的Test4类中调用son.method1(5);此时也是可以编译通过的。

package com.txl;

import com.example.Son;

public class Test4 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Son son = new Son();
        //这里为什么能在Test4类中访问Son继承自Father的protected方法呢?因为Test4类和Father在同一个包
        son.method1(5);

        Test4 test4 = new Test4();
        //在Test4本类里面,可以通过对象调用从Object继承过来的clone()方法。当然会报错,因为该类没有实现Cloneable接口
        test4.clone();
    }
}
复制代码

小结

    1. protected修饰的方法或者变量:可以在同一个包下(protected修饰的方法或者变量所在的包)的任意位置访问,此时protected相当于public。
    1. 当子类继承了父类中的protected方法或者变量时,也要满足小结1,可以在protected方法所在包下调用。除了该规则也可以在本类中调用该protected方法或者变量。
    1. 主要还是包规则:protected修饰的方法变量只能在本报下访问,或者在子类内部访问。

© 版权声明
THE END
喜欢就支持一下吧
赞赏 分享
相关推荐
  • 暂无相关文章
  • 评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容