Java跨包访问protected和default访问控制符

类的三大修饰符是public、abstract和final。
而类成员的访问控制符为public、protected、default(也叫作friendly、pacage、缺省、无控制符)和private
其访问权限为:

img
-------------------------------------------图1-------------------------------------------------

但是我对protected、default还不太理解,想深入了解一下。
为了研究Java访问控制符default(也叫作friendly、pacage、缺省、无控制符)和protected的实质
我写了一个小项目,工程名为“test210828”的Java Project
这是我的项目目录结构:
img
-------------------------------------------图2-------------------------------------------------

gg和aa为不同的包名
继承关系是:gg.Animal←—gg.Dog
(前面缩进)gg.Animal←—aa.Dog←—gg.Erha (意义为狗品种“二哈”)
(前面缩进)gg.Animal←—aa.Dogg←—gg.Erhaa (重写了方法的)
写了这么多类,无非是让各个子类把所有的父类default和protected访问权限的成员和方法都赋值和调用一遍,报红报错的就可以判断出其不符合访问控制规则。

首先gg.Animal类

img
-------------------------------------------图3------------------------------------------------

访问控制符为protected的成员变量protected_name
访问控制符为缺省的成员变量default_name
访问控制符为protected的成员方法void go_protected()
访问控制符为缺省的成员方法void go_default()

gg.Dog类(同包子类)

img
-------------------------------------------图4-------------------------------------------------
可见同包继承情况下,父类的protected和default的所有变量和方法,子类,多态子类和父类的对象都可以访问。test方法中,访问继承下来的所有对象和方法都没有问题。test1方法中,可以访问父类的对象和方法。

aa.Dog类(异包子类)

img
-------------------------------------------图5-------------------------------------------------
可见异包继承情况下,对父类的protected变量和方法,子类可以有效地继承,但只能用子类对象调用它们,不允许用父类对象或多态地父类对象调用它们;而对父类的default变量和方法,不属于同一包的子类不能有效地继承,所以都被拒绝访问。test方法中,访问继承下来的控制符为protected的变量和方法可以,访问继承下来的控制符为缺省的变量和方法不行。test1方法中,不可访问父类控制符为缺省的变量和方法,可以访问控制符为protected的变量和方法。

gg.Erha类(同包间接子类)

img
-------------------------------------------图6-------------------------------------------------
这是与Animal同属一个包的孙辈间接子类(然而儿辈是外包的),从这里我就开始看不透了

aa.Dogg类(异包但重写方法的子类)

img
-------------------------------------------图7-------------------------------------------------

gg.Erhaa类(同包但“继承于重写方法的Dogg子类”的间接子类)

img
-------------------------------------------图8-------------------------------------------------

求各位业界精英的从继承控制符与多态方面深度剖析原因:
1.相同的访问控制符,相同的访问“变量和方法”的方式,为何有一些异类包子类不可以访问而同包间接子类可以访问的情况呢?
2.为何图6第13行(和19行)第三个语句没报错而图8的同位置报错?为何图6第10、13和19的第四条语句的报错信息和图8的同位置不同?即下图标记的地方:
图6 Erha类
img
图8 Erhaa类
img

实际项目中我只写private和public😂😂基本上没见过有人写protected

你的意思是protected修饰后,不同包,子类可以访问,但是子类的子类就不能访问了?