这两天回忆一些Java基础,感觉自己很多地方都不是很牢固,也花费在不少时间和不少流量在手机上查资料。

还是写下来这些东西以免再忘记。

同时还是要记住多动手,编程最重要的就是动手敲啊,有想法有疑问就要自己去实现去验证。

1. 访问控制

  

  Java的默认访问权限(包访问权限)跟C++中的友元很像其实,都具有一定的特殊性。

  同一个包中的类是可以任意访问其他类的非私有成员的,而如果继承关系发生在同一个包中,子类继承的所有非私有成员都是可见的。

  但如果继承不是发生在同一个包中则会有很大不同,通过继承导入的包,子类只有继承的保护和公有成员才是可见的。

  导入的包只能导入该包内的公有类和该公有类的公有成员,保护成员在子类中可见,但即使在子类中也不能通过父类对象来访问保护成员,只能通过子类访问继承后的保护成 员。

  继承发生的时候其实子类都会继承父类的所有成员,不管是私有保护或者公有,只是访问修饰符不同导致了可见性的不同。

  C++中的友元,允许访问友元类的所有变量,包括私有变量包括通过对象或对象作为函数引用参数访问。在子类中是不可以通过对象访问父类的保护成员的。只有公有成员可以通过对象或对象指针访问。

  C++有三种继承方式,最常用的还是public继承,而且Java直接阉割了其他的两种继承方式。

   关于类成员的protected权限,其实是很值得琢磨的我觉得。

  介于private和public之间,在Java中,在同一个包内发生的继承就不说了,除了非私有成员其他类(包括子类)都可以任意访问,包括通过对象访问,子类继承的除非私有成员外也都具有可见性。和如果在不同包下的继承,在子类中就没有办法通过父类对象访问protected成员,在这一点上和C++还是很像,C++中子类是没有办法通过父类对象访问父类的保护成员的。

  关于访问控制,其实OOP思想的语言都大同小异,不管是Java,C++,还是C#。

2. 抽象类与接口

  抽象类中可以没有抽象方法,但具有抽象方法的类必须定义为抽象类,抽象类不能实例化。

  接口中的变量自动具有public static final属性,接口中的方法自动具有public abstract属性,接口允许多继承。

  C++中含有纯虚函数的类称为虚基类,和Java中的接口比较像,但虚基类中的函数除了纯虚函数都可以有自己的实现,虚基类同样不能实例化。纯虚函数不能有自己的函数体,但是纯虚析构函数除外。

3. 重写与重载

  C++中用虚函数来实现多态机制,而Java中的类的方法都是隐式的虚函数。

  重写(覆盖、override、overwrite)是子类和父类的变量名变量类型、方法名方法参数的类型个数顺序完全一样。

  重载是函数名相同,参数类型、参数个数有一个不同,参数顺序的差异可不可以构成重载视情况而定,函数的返回值不同构不成重载。

  在子类中访问父类被覆盖的成员变量或方法,Java用super,C#用base,C++用作用域运算符::。

  动态绑定的时候如果访问成员变量的话,都是访问父类引用(Java)或父类指针(C++)指向的父类的成员变量,C++和Java皆如此。

  动态绑定的话只有存在重写的情况才会调用子类的方法函数,如果不存在重载就直接在父类中寻找,如果找不到就报错。

  如下面的例子:输出  ”father“。

  

  Java中可以有所谓的”跨类重载“,但是C++中却不允许,具体可以参考这篇博文:http://blog.csdn.net/anialy/article/details/7621619。

  而C++中肯定也有可以突破这种限制的方法,见这里:http://blog.csdn.net/autumn20080101/article/details/8514813。

  关于C++的虚函数与重写,我觉得这篇文章讲的很好:C++的虚函数与重写。

4. Java/C++中的hash_map/unordered_map的实现原理。

  其实就是一个哈希函数,配合数组和链表实现,会存在数组的重新动态分配的过程。

5. 对Java多态的再思考

  首先子类会继承父类的所有成员变量和方法,即使是父类中的private部分,这是Java和C++肯定没错的地方。

  从这个意义上来讲,以前想过的对象初始化问题,其实就相当于“子类自己对象的初始化”,而外在表现形式上看起来像先父类后子类等等那些初始化顺序。

  然后就是多态是基于重写的,实际上仔细想想,如果在子类中重写父类方法的话,因为肯定已经继承父类的方法,所以相当于在子类里面有两个“一模一样”的函数,

  但是,在面向对象的过程中,这是允许的,这叫做重写(覆盖,override,overwrite),继承的父类的函数会被隐藏掉。

  而正确调用对应的函数无疑依赖于多态由机制原理上的实现,看来了解C++的虚函数表等底层一点的知识还是极其有必要。

6. C++中的using声明

  using声明用于将变量或函数引入某一个空间,使其由不可见变为可见状态。

  联想到上面提到的子类重载继承的父类的函数,在C++中子类再想调用重载过的父类的函数,就必须用using声明将其引进来。

  而Java中,在子类中继承的父类的函数即使被重载过还是可见的,只有在被重写的情况下才会失去其可见性。

  有点令人意外的是,在C++中,子类中,using声明可以引入被重写过的父类的函数,虽然这样做没有任何卵用,这个父类的函数依旧是不可见的。

  其实这是合乎理的做法,你既然已经重写了父类的函数,就已经视为你在子类的作用域中不再需要这个父类的这个函数,所以即使你强行引入,依旧是不可见的。

  需要注意的是,using声明在哪个访问权限下会决定该变量或函数的访问权限问题。

  而且,C++11新标准下,引入了一个新的语法糖,姑且称为“继承的构造函数”,当然是加引号的。

  用using声明来在子类中引入父类中众多的构造函数,相当于实现“透传”,这个using声明的主要作用是令编译器产生子类的构造函数代码。

  using用于父类的构造函数还有很多和通常的using不同之处,比如不会改变访问权限,比如不会引入默认、拷贝、移动构造函数。

  详细的说明和例子在C++ primer中。

  个人感觉这就是一个很甜的语法糖。

7. Java中子类对基类的方法进行重写时,不能具有比父类更严格的访问权限,而C++中却无此规定。

转载于:https://www.cnblogs.com/niuxichuan/p/5854761.html

Java基础以及与C++的一些对比相关推荐

  1. 多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态

    @Python大星 一.Python 类的封装.继承和多态 封装 继承 Python 支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Pytho ...

  2. python 面向对象_Python 和 Java 基础对比 08 —— 面向对象

    一.面向对象编程(object oriented programming) 简称:OOP,是一种编程的思想. OOP把对象当成一个程序的基本单元,一个对象包含了数据和操作数据的函数. 面向对象的出现极 ...

  3. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...

  4. 叮!您收到一份超值Java基础入门资料!

    摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例带领大家J ...

  5. Java基础、多线程、JVM、集合八股文自述(持续更新)

    Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...

  6. 程序猿的日常——Java基础之equals与hashCode

    equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...

  7. 黑马 程序员——Java基础---流程控制

    黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...

  8. java9.0.1教学,零基础Java基础教程【9天入门】

    零基础Java基础入门教程 中级共14课 本课程将会从零基础学员角度出发,带你9天快速掌握 Java,课程知识点编排循序渐进,能够将每一个知识点落地到实际案例,拒绝"听得懂.不会练.不会敲& ...

  9. java基础知识-对象和类

    前言: 因为要准备Java面试,所有将java基础知识点重新复习一遍,主要笔记来源于菜鸟教程和java核心技术的书籍中,也有一些博客上的资料(这些只供我个人学习使用) Java 对象和类 对象:对象是 ...

最新文章

  1. 复习计算机网络基础 day4--OSI与TCP/IP初步认识
  2. 【转】使用Windows Backup备份Exchange 2007 SP2和Exchange 2010
  3. java贪吃蛇_如何用Java还原童年回忆?在线教你完成贪吃蛇小游戏
  4. 坚持探索与落地并重,阿里巴巴云原生之路全景揭秘
  5. 计算机网络相关的知识,计算机网络相关知识整理
  6. Bailian3670 计算鞍点(POJ NOI0108-05)【矩阵】
  7. python中递归函数
  8. 下列符合c语言语法的变量名是,设有关变量已经正确定义并赋值,则下列表达式中符合C语言语法规则的是...
  9. Sql Server快速入门
  10. MongoChef malformed UTF-8 character sequence at offset 89
  11. PHP中json对象转数组过程中去除字符串中的换行与数字方法
  12. WPS技巧之稻壳模板掌握结构全面信息
  13. java生成类图_Java反向生成类图
  14. LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置
  15. 便利蜂创始人数字化经验分享:如何用全链路数字化 重塑零售业
  16. vs2019安装时,一直卡在正在提取文件
  17. exchange服务器没有响应,exchange服务没法启动!急!
  18. JavaScript 正则表达式
  19. 使用Xmanger/Xbrowser 远程桌面Ubuntu 12.04 LTS
  20. 基于Java毕业设计校园线上点餐系统源码+系统+mysql+lw文档+部署软件

热门文章

  1. java 泛型详解-绝对是对泛型方法讲解
  2. 玩转 React(二)- 新型前端开发方式
  3. depcomp: line 571: exec: g++: not found
  4. 删除U盘作为启动盘的隐藏启动分区
  5. Android4.1 新功能 新特性(转)
  6. MyEclipse Build path contains duplicate entry
  7. android listView的setOnScrollListener的使用
  8. gradle的插件包
  9. getDimension,getDimensionPixelOffset和getDimensionPixelSize的一点说明
  10. LinearLayout(线性布局)