访问控制


  C++和Java均具有封装概念,所以也有面向对象所具有的封装中的访问控制,这些访问控制在C++中只区分类内、类外、父子类,而在Java中进行了合理的保留和舍弃,将区分扩展到了包级,类似于C++中的命名空间。

一、针对类的成员访问控制符

  C++:private(class默认)、protected、public(struct默认)

  Java:private、package(默认)、protected、public

  Java比C++多了一个默认的访问控制package,即包访问控制,即类内成员在本包内均可以访问。

  本人认为Java改进了C++的命名空间,用包名作为名字空间名,简化了命名空间不易阅读,而且具有C++命名空间名没有的优点。引入头文件改为引入带有包名的类,使得能够根据类的全路径名轻易找到类的定义位置,而且整个工程用包进行管理,根据模块功能定义包名划分工程,能够轻易简单的将相关的类定义在同一包中,使得整个项目结构清晰,易于维护,同时到达了模块内高内聚,模块间低耦合的要求。由于同一个模块内的类是相关的,相对紧密相连的,所以将其成员变量的访问控制定义为包级访问控制时极具意义的,这样包内可见,包外不可见。

  其他访问控制符作用效果一样。

二、针对接口的成员访问控制符

  C++:没有接口不过可以用抽象类当做接口,不过没有Java的接口设计合理

  Java:接口内所有的成员变量均是public,因为接口本身就是在模块之间、层次之间起协议作用的,并不涉及具体实现,而且协议对于双方而言都应当是公开的。

三、针对类访问控制符

  C++:没有

  Java:public、package

  public:所有地方可见,对其他所有类暴露本类

  package:包内可见,包外不可见

由于一个模块内的所有类并都不是其他模块可见,有可能仅仅为本模块所拥有,即为本包拥有,所以设计成有包区分的类是有有意义的。而C++的所有类则没有这种限制,在此,C++对类的控制力度不够,只要其他文件引入头文件,则可以使用,属于不合理的。从另外一个角度看,C++的命名空间并没用进行访问控制,均是开放的。

四、针对于类的继承的访问控制符

  由于C++的访问控制包含了类的继承,对类的继承也有private(class默认)、protected、public(struct默认)继承模式。

父类对象不能用非公有继承的子类对象进行初始化或者赋值。

父类指针或者引用不能指向非公有继承的子类对象。

  非公有继承的子类无法加入基于父类的多态框架中。但是私有继承可以帮助我们复用基类代码,并防止基类接口的曝光。但是父类接口对于其他类还是处于曝光状态,只是不能通过私有继承类这个渠道去曝光,所以并不是很实用,更何况有比继承耦合性更低的组合,可以达到私有继承的效果,即将父类作为子类一个私有成员,让后复用其代码。

  针对于private继承,个人感觉意义不大,甚至很鸡肋,难道要子类将从父类继承过来的成员隐藏起来?父类的成员访问控制不应该自己做吗,父类对外既然都声明公开了,子类反而说要私有,这有个严重的后果,就是违反了里氏代换原则(任何基类可以出现的地方,子类一定可以出现),基类出现的地方,并且具有对其成员的访问,而子类替换基类之后(这种所说的替换是强硬替换,即所有父类对象出现的地方,全部替换成子类对象,而不是父类指针或者引用指向子类对象),由于子类将父类继承过来的成员私有化了,则会造成无法访问原本可以访问的成员的问题。这好比,上层领导给人民一个承诺,下层领导却不承认该承诺,这极其不合常理。实际上C++也不是没有作为的,C++编译器不允许使用父类指针或者父类应用指向私有继承的子类对象,并且倘若是强硬替换,也会在无权访问的地方抱错,虽然这个保证了不会违反里氏代换原则,则但是这样也是会使得该子类无法参与多态,或者说该实现无法加入由多态为基础的框架中去,从而使得C++的多态遇到了蹩脚的地方。针对protected继承,也是有存在类似问题的,不予赘述。

  根据工程经验,实际工程使用过程中基本是使用public继承。估计是Java吸收了这个经验,所以Java中不存在继承访问控制,倘若要说的话,Java中所有的继承均是公有继承,子类不会改变父类对外的承诺,即子类不会改变父类的成员的访问控制

  若有不正之处,请谅解和批评指正,不胜感激。

  请尊重作者劳动成果,转载请标明原文链接:http://www.cnblogs.com/Isen/p/6683523.html

转载于:https://www.cnblogs.com/Isen/p/6683523.html

C++ VS Java 系列 —— 访问控制相关推荐

  1. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  2. Java系列笔记(1) - Java 类加载与初始化

    2019独角兽企业重金招聘Python工程师标准>>> 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如 ...

  3. 跟老杨学java系列(一)前传

    跟老杨学java系列(一)前传 首先声明一下哈,本人文笔水平有限,不喜勿喷.欢迎大家留言探讨技术问题.其他问题概不回复. 上台来首先做个自我介绍(~~偷师相声开场白),本人从事IT开发行业快二十个年头 ...

  4. java sftpv3client_Ganymed SSH-2 for Java系列8之SFTPv3Client说明

    Ganymed SSH-2 for Java系列8之SFTPv3Client说明: SFTPv3Client是SSH for java的一个SFTP(协议版本 3), 客户端通过SSH-2连接的一个简 ...

  5. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转] 目录 参数设置 收集器搭配 启动内存分配 监控工具和方法 调优方法 调优实例       光说不练假把式,学习Java GC机制的目的是为了实用,也 ...

  6. php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc

    php转java 系列2 Spring boo 链接数据库jdbc JDBC 首先创建一个新项目,在创建项目时要注意导入依赖, 在项目创建成功后就会看到在 pom.xml 文件中找到,但是如果在创建项 ...

  7. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  8. 【Java系列】(四)Java多线程---线程安全

    前言: 记得大一刚学Java的时候,老师带着我们做了一个局域网聊天室,用到了AWT.Socket.多线程.I/O,编写的客户端和服务器,当时做出来很兴奋,回学校给同学们演示,感觉自己好NB,呵呵,扯远 ...

  9. 教老婆学java系列之奇妙的数据结构四

    教老婆学java系列之奇妙的数据结构四 数据结构最后一节 思考题:后台处理一件事,耗时较长,怎么将信息显示在页面上 问题解析: 1.前端触发,后端处理时间较长,前端不能等处理完成. 2.如果不等处理完 ...

  10. Ganymed SSH-2 for Java系列11之SCPClient

    Ganymed SSH-2 for Java系列11之SCPClient SCPClient是一个基本的java操作类,其可以从服务器复制文件到SSH-2服务器,或者从服务器上scp出文件到本地服务器 ...

最新文章

  1. dw的css样式怎么删除掉,三种方法教你DreamWeaver下如何应用CSS样式
  2. 微信8.0全心全意考虑用户需求为企业开展网络营销带来全新思考
  3. HDU2034 人见人爱A-B
  4. swiper 滚回第一个数据_名企必备的数据分析基础技能:Python大法(一)
  5. php简单网页制作代码,用HTML和CSS以及JS制作简单的网页菜单界面的代码
  6. JS实现上下左右对称的九九乘法表
  7. js把日期字符串转换成时间戳
  8. C# DES加密/解密类
  9. 关于servlet类,继承HttpServlet,但是无法导入HttpServlet包的原因和解决方法
  10. 关于导入swf时安全域与应用域的问题
  11. OpenGL和OpenCV的区别
  12. Anytime项目开发记录3
  13. visual studio 2013 快速安全ocx(ActiveX控件)开发
  14. 学习党Win10装机必备软件
  15. 轻松实现页面提交时,显示“提交中..”
  16. Android Camera 测光梳理
  17. 那些好看的渐变色linear-gradient(拿走不谢)
  18. html导出带页码的word,使用js把html导出word,并配置样式和分页功能
  19. java 面试题合集_撩课-Java面试题合辑1-50题
  20. mysql经典45道题_MySQL查询 45道练习题

热门文章

  1. 《Windows 8 权威指南》——2.10 几招解决Windows 8 Metro应用打不开的问题
  2. shopnum1商城系统
  3. 处理Windows 7爆音杂音和网游ping值过高
  4. VSS无法访问的问题
  5. 冲刺一团队五亲亲精英队
  6. Maven常用命令汇总
  7. springboot2的redis缓存管理器cacheManager配置,使存入json格式数据
  8. Java经典编程题50道之四十二
  9. SQL极限函数limit()详解分页必备
  10. tomcat,zookeeper,activeMQ,Kafka设置jvm参数