本文共 1323 字,大约阅读时间需要 4 分钟。
Java中无法操作对象所指向的内存地址,new一个对象,你只能看不能改这个对象所指向的内存地址
C++ 可以随意修改对象所指向的内存地址
class A{ public void test(){ System.out.println("A TEST"); } public void test(int a){ System.out.println("A TEST" + String.valueOf(a)); }}class B extends A{ //和c++不同 这里并不用担心 重写test后 会导致隐藏而无法调用test(int) //c++ 需要 using A::Test;才可以调用test(int) @Override public void test(){ System.out.println("B TEST"); }}
还是用上面的代码
A a = new B();
- 在 java中 调用a对象的test,其实是会调用到B类的test,
- 而在c++ 中 如果函数前没有virtual,会调用到A类的test
- 简单的说java 中所有方法,自带了virtual的效果。
- 如果想屏蔽掉,只能重写后使用super调用。
java没有析构函数
缺点: c++ 可以在类析构方法中写close和清理代码 java 只能手动的调用close或clean代码 或 使用phantom引用+引用队列可以用来做是否要清理的判断,比较麻烦(这里说的要清理是成员对象被加入引用队列,并不是自己)
在java 中 你不能使用operator进行运算符重载,例子:
假设有个类叫Calc,有个成员是value,构造函数是value值
JAVA
Calc a = new Calc(1); Calc b = new Calc(2); 如果想让a对象的value和b对象的value相加,那么java只能这么做 a.setValue(a.getValue()+b.getValue); 要么就写add方法,方法里面传对象进行修改 更麻烦一些的让a的value增加常量值,又得重载一遍addC++
只需要用operator重载运算符+就可以做到 Calc & operator+(const Calc & b){this.value+=b.value;breturn *this;} 现在我们只需要a=a+b;就可以了
JAVA为了方便使用,new对象到堆后,不需要手动释放,垃圾回收器会自动判断与GCROOT的关系,来进行自动的回收管理。
c++需要手动的free或delete创建的堆。但是现在基本应该没了,都是智能指针,一般情况下C/C++程序员需要自己实现内存池。
C++ 可以明确规定引用类型,左值或右值,并且有完美转发,解引
Java 完全是自动的,你无法控制参数是左值或右值
转载地址:http://rtlsi.baihongyu.com/