做者:Khellendros
连接:https://www.zhihu.com/question/29774397/answer/276514866
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。 java
引用:
java和c++都有引用的概念,但二者是彻底不一样的东西,c++的引用是变量的一个别名,引用一旦绑定就不能从新引用其余变量,c++引用也不能为null。java引用更像c++的指针,对引用赋值是从新绑定引用的对象(在c++里面是改变对象的值),引用能够为null(致使了烦人的NPE问题,万恶之源)
类型系统:
java区分值类型与引用类型,用户自定义类型都是引用类型,值类型和引用类型在不少地方不能混用(如泛型参数),c++没有值类型和引用类型的概念,相似的概念是普通类和它的指针类型。
java有根基类Object,c++没有根基类。
访问控制:
都有public,protected,private三级访问控制
此外,java还有包访问控制,c++有友元
继承:
c++分public继承,protected继承(意义不明)和private继承(基本和组合没啥区别),java只有public继承。
c++只能覆盖基类中显式定义的虚函数,java中方法默认是虚的,除非显式标明final
c++支持多重继承,java只支持单继承,但支持实现多个接口(c++没有语法层面上的接口)
构造与析构:
对象构造大体相同,可是c++在构造函数中调用虚函数没法多态(由于对象的子类部分还没构造)
c++能够定义析构函数,java没有析构函数(java提供一个终结方法,但它和析构函数不是等价的)
对象生命周期控制:
c++主要靠手动申请,释放内存或者借助析构函数(RAII技术),java依靠gc
异常处理:
c++没有也不须要finally块,释放资源依靠析构函数就好了。
泛型:
c++模板采用代码生成技术,运行时可以保留类型信息,java采用类型擦除,类型信息在运行时就没了(因此其实只是进行安全的自动类型转换而已……)。c++模板参数能够是基本类型,用户自定义类型和整型常量,java只能是引用类型。c++还能够对模板进行特化,java没有这个功能。
其余:
c++有运算符重载,java没有(除了String类重载了+)c++