Java学习4-关于父子类关系中protected关键字的新认识

学习Java基础知识时,学习到类的继承关系时就会看到一张父子类中,子类能访问父类资源的开闭关系,入下表

Java访问控制范围
  类内部 同包下 子类 外部类
public ✔️ ✔️ ✔️ ✔️
protected ✔️ ✔️ ✔️ ×
default ✔️ ✔️ × ×
private ✔️ × × ×

很多年都认为只要是protected修饰的,子类时可以访问的,这个并没有错的,但是今天无意中在一个测试类中想编写以下代码

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:resourceTestXml.xml");
classPathXmlApplicationContext.loadBeanDefinitions();

但是idea并没有提示存在这个方法。这是spring源码中的类,ClassPathXmlApplicationContext的直接父类是AbstractXmlApplicationContext,父类中实现了AbstractXmlApplicationContext父类的父类的抽象方法loadBeanDefinitions方法。

然后我打开已经装载编译好的spring的源码在ClassPathXmlApplicationContext中某一个方法中加入loadBeanDefinitions是可以的,一下子有点懵,protected关键字修饰的方法子类时完全可以调用的为什么上面的代码不行,同在org.springframework.context,support包中,并且是父子类继承关系。然后细细再品味了下上面的表格,访问限制关系。突然发现我编写这行代码的包是我自己创建的包,编写代码的类也不存在父子继承关系,所以不行。

从而明白,这里指的子类其实是指子类内部,如果子类在别的包中,那么子类也是看不见这个方法的,或者没有权限,因为不在一个包下。这样其实就很好的封装和保护了spring底层源码。

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);

你可能感兴趣的:(Java)