今天根据要求对集中访问控制符做了测试,在子类跨包继承的权限问题,发现有些矛盾。

代码说明:父类Father 在packageA中  子类Child01也在packageA中  子类Child02在packageB中

下面上代码;

1 packagepackB;2 importpackA.Father;3 //本类是Father类不同包的子类

4 public class Child02 extendsFather5 {6 public static voidmain(String[] args) {7 Father father = newFather();8 System.out.println(father.public_a); //public修饰的成员,在不同包中子类能访问9 //System.out.println(father.protected_b);//protected修饰的成员,在不同包子类中不能访问10 //System.out.println(father.default_c);//default修饰(默认)的成员,在不同包子类中不能访问11 //System.out.println(father.private_d);//private修饰的成员,在不同包子类中不能访问

12

13 father.pulic_aa(); //public修饰的方法,在不同包子类中能访问14 //father.protected_bb();//protected修饰的方法,在不同包子类中不能访问15 //father.default_cc();//default修饰(默认)的方法,在同包子类中不能访问16 //father.private_dd();//private修饰的方法,在同包子类中不能访问17

18 //下面是个人对跨包继承的深入理解,与别人的理解和说法有些矛盾 由于方法的权限和属性一样 就不写了19

20 //访问方式一:

21 Child02 child = newChild02();22 child.public_a = 10;23 child.protected_b = 20;24 //child.default_c = 30;//报错 父类该属性对子类不可见25 //child.private_d = 30;//报错 父类该属性对子类不可见

26

27 }28 //访问方式二:

29 voidtest(){30 public_a = 10;31 protected_b = 20;32 //default_c = 30;//报错 父类该属性对子类不可见33 //private_d = 30;//报错 父类该属性对子类不可见

34 }35 //访问方式三:

36 voidtest1(){37 super.public_a = 10;38 super.protected_b = 20;39 //super.default_c = 30;//报错 父类该属性对子类不可见40 //super.private_d = 30;//报错 父类该属性对子类不可见

41 }42

43

44

45

46 }

从第7行到第16行,是对在跨包子类中的Father对象进行操作,访问结果说明只能访问到 public修饰的属性和方法。

就是从这里产生了矛盾,因为和之前所了解的内容有出入  故对其进行深入了解。

下面从第20行到第40行是另外的三种访问方式 和之前了解的权限相匹配;

方式一:是访问子类对象中从父类继承的属性,发现父类中protected修饰的属性可以被访问,此时访问的是子类对象的属性;

方式二:是访问子类中从父类继承的属性,发现父类中protected修饰的属性可以被访问,此时访问的属性是子类的属性;

方式三:通过super来调用父类的属性,这里会让人觉得这个肯定是父类调用自身的属性了;

于是我对代码进行改造,让结果变得更明显:

Father 类

1 packagepackA;2 //本类是参考类,用来和child、uncle了来测试

3 public classFather {4 //成员变量

5 public int public_a = 1;6 protected int protected_b = 2;7 int default_c = 3;8 private int private_d = 4;9 //方法

10 public voidpulic_aa(){11

12 }13 protected voidprotected_bb(){14

15 }16 voiddefault_cc(){17

18 }19 private voidprivate_dd(){20

21 }22

23 public static voidmain(String[] args) {24

25 }26

27 }

Child02类

1 packagepackB;2 importpackA.Father;3 //本类是Father类不同包的子类

4 public class Child02 extendsFather5 {6 public static voidmain(String[] args) {7 Father father = newFather();8 System.out.println(father.public_a); //public修饰的成员,在不同包中子类能访问9 //System.out.println(father.protected_b);//protected修饰的成员,在不同包子类中不能访问10 //System.out.println(father.default_c);//default修饰(默认)的成员,在不同包子类中不能访问11 //System.out.println(father.private_d);//private修饰的成员,在不同包子类中不能访问

12

13 father.pulic_aa(); //public修饰的方法,在不同包子类中能访问14 //father.protected_bb();//protected修饰的方法,在不同包子类中不能访问15 //father.default_cc();//default修饰(默认)的方法,在同包子类中不能访问16 //father.private_dd();//private修饰的方法,在同包子类中不能访问17

18 //下面是个人对跨包继承的深入理解,与别人的理解和说法有些矛盾 由于方法的权限和属性一样 就不写了19

20 //访问方式一:

21 Child02 child = newChild02();22 child.public_a = 10;23 child.protected_b = 20;24 //child.default_c = 30;//报错 父类该属性对子类不可见25 //child.private_d = 30;//报错 父类该属性对子类不可见

26 child.test();27 child.test1();28 }29 //访问方式二:

30 voidtest(){31 public_a = 10;32 protected_b = 20;33 System.out.println(public_a+"*"+protected_b);34 System.out.println(super.public_a+"*"+super.protected_b);35 Father father01 = newFather();36 System.out.println(father01.public_a);37 //default_c = 30;//报错 父类该属性对子类不可见38 //private_d = 30;//报错 父类该属性对子类不可见

39 }40 //访问方式三:

41 voidtest1(){42 super.public_a = 10;43 super.protected_b = 20;44 //super.default_c = 30;//报错 父类该属性对子类不可见45 //super.private_d = 30;//报错 父类该属性对子类不可见

46 }47

48

49

50

51 }

输出结果:

从结果可以明显的看出通过super方式得到是Child02类的public_a的属性,并不是Father类的public_a的属性;

强势插入一段自己对super的理解,super是子类对父类的一个引用,指向子类从父类继承下来的属性,若指向父类中子类没有继承的属性则会报错,另外如果子类对继承的属性进行重写,则super指向父类的该属性。

我们可以看看和Father同包的Child01类里面指向没有继承的属性是不是可以:

1 packagepackA;2 //本类是Father类同包的子类

3 public class Child01 extendsFather4 {5 public static voidmain(String[] args) {6 Father father = newFather();7 System.out.println(father.public_a); //测试证明 public修饰的成员,在同包子类中能访问

8 System.out.println(father.protected_b); //测试证明 protected修饰的成员,在同包子类中能访问

9 System.out.println(father.default_c); //测试证明 default修饰(默认)的成员,在同包子类中能访问10 //System.out.println(father.private_d); 测试证明 private修饰的成员,在同包子类中不能访问

11

12 father.pulic_aa(); //测试证明 public修饰的方法,在同包子类中能访问

13 father.protected_bb(); //测试证明 protected修饰的方法,在同包子类中能访问

14 father.default_cc(); //测试证明 default修饰(默认)的方法,在同包子类中能访问15 //father.private_dd(); 测试证明 private修饰的方法,在同包子类中不能访问

16 }17 voidtest(){18 super.public_a = 10;19 super.protected_b = 20;20 super.default_c = 30;21 //super.private_d = 30;//报错 父类该属性对子类不可见

22 }23 }

这样就充分说明了,属性的继承和super使用条件,也就是方式三中访问的属性其实是Child02类的属性,也就是说在跨包的子类里面访问父类的属性的还是只有public;

同时子类继承权限因为跨包影响,从pulic,protected和default 变成 pulic和protected;

java 可以继承不同包的类吗_深入理解JAVA中的跨包继承相关推荐

  1. Java运行时动态加载类之ClassLoader加载class及其依赖jar包

    需求场景是:通过ClassLoader动态加载外部class文件,class文件又依赖某个具体jar包,需要动态加载jar包,采用URLClassLoader. 1.xml配置文件 <?xml ...

  2. 深入理解JAVA中的跨包继承

    今天根据要求对集中访问控制符做了测试,在子类跨包继承的权限问题,发现有些矛盾. 代码说明:父类Father 在packageA中 子类Child01也在packageA中 子类Child02在pack ...

  3. JAVA类加载对字节码的处理_深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)...

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 周志明的< ...

  4. c++ 类数组_《深入java虚拟机》读书笔记类加载

    概述 类加载机制是指虚拟机将描述类的数据从Class文件中加载到内存,并进行数据验证.解析.初始化等过程,最后形成可以直接被虚拟机使用的java类型.在java语言中类的加载.链接.初始化等过程并不是 ...

  5. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  6. java类二次加载_深入理解java之类加载器

    一.类与类加载器 类加载器:实现加载阶段的第一步,通过一个类的全限定名来将这个类的二进制字节流加载进jvm. 类与类加载器:任意一个类唯一性都是由它本身和加载它的类加载器确定,两个类是否相等在它们是由 ...

  7. JAVA类思维_面向对象思维 Java中的类和对象及其应用

    一.面向过程与面向对象 面向过程: 从事务执行者的角度思考问题,我该干什么  重点在过程----事务流程 面向对象: 从事务的指挥者角度思考问题,我应该找谁干什么  重点在对象 面向对象的优点: 1. ...

  8. java 关注公众号没有调接口_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  9. Java继承_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

最新文章

  1. python windows时间同步工具
  2. 怎样在python代码中输入π_鼠标自动点击、键盘自动输入?几行Python代码搞定
  3. python中的json_简单介绍Python中的JSON使用
  4. C++什么时候需要使用“常引用”?
  5. 牛客多校10 - Decrement on the Tree(边权转点权+思维)
  6. 【小议】centos与ubuntu的区别
  7. 该文章为递归寻找目录下目标文件(待完善,但是能用)
  8. Stack(nowcoder 11253-K)
  9. mysql为什么总是错的_这个mysql如何总是错的
  10. 营业执照在线生成_营业执照用旧的?办新的?办电子的?丨现在选哪个都很“好办”...
  11. js将两张图片合成一张图片
  12. 计算机显示的数据的格式,GPS 数据格式及显示问题!!!
  13. IDEA关联MySQL数据库库
  14. 解决:RuntimeError: mat1 and mat2 shapes cannot be multiplied (8x256 and 8x256)维度不匹配问题
  15. nvm 安装node版本报错clang: error: no such file or directory: ‘CXX=c++‘
  16. 酒仙网IPO被终止:曾拟募资10亿 红杉与东方富海是股东
  17. Spark—15分钟教程
  18. hadoop3.x\2.x常用端口,和常用配置文件
  19. 2021外卖返利小程序饿了么美团外卖侠分销系统源码
  20. ICPC 2018 南京站游记

热门文章

  1. 【sbt】sbt package与sbt assembly
  2. 特斯拉 自动驾驶 芯片_关于特斯拉和英国全面自我驾驶的真相
  3. 【收藏】2010年Ei收录的中国期刊
  4. 用神经网络表示与逻辑,神经网络实现逻辑运算
  5. 历史事件词条1000条
  6. python 使用input函数输入两个数字,比较两个数字的大小,并输出较大的数
  7. 综合素质——作文——规则意识、人品教育、自信、用于探索、开拓前行;
  8. win10ltsc安装后重启提示bitlocker有问题怎么办_TIA Portal博途常见的15大问题汇总
  9. dYdX会是DeFi下一轮爆发的引擎吗?
  10. 2021级-JAVA03 基础语法2--控制语句