XXZXGG 2021-09-01 01:26 采纳率: 0%
浏览 34

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

  • 写回答

2条回答 默认 最新

  • 道-闇影 2021-09-01 07:05
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 9月1日

悬赏问题

  • ¥15 CBF预处理数据归一化的时候报错了如下图
  • ¥15 qt 转 msvc 后 Opencv 始终打不开视频!
  • ¥15 yolo v5中labelimg的作用
  • ¥15 国赛c题2021,没有理解这一串代码的意思,这样报错该怎么解决(语言-matlab)
  • ¥15 一、执行完中断程序后如何继续运行,二、中断结束后如何跳过中断触发前的点位(LOW点不要继续运行,可以运行UP点)(关键词-程序运行)
  • ¥15 if为什么跳过if 直接执行else 中文
  • ¥200 解决登录微信老版本限制封号问题
  • ¥15 mysql中时间处理问题
  • ¥20 讲解此音频放大电路原理及关键部分
  • ¥15 rtsp 转 m3u8 执行后卡在Decoding VUI