我需要将此程序转换为java。我可以处理除析构函数之外的所有其他内容。现在我已经阅读了关于GC(垃圾收集器)的所有内容并且它不可靠。我正在考虑为什么如果没有某种方式或什么的话,为我转换一个析构函数。
#include<iostream>
using namespace std;
class Timer{
public:
Timer();
~Timer();
};
Timer::Timer(){
cout<<"Install a timer"<<endl;
}
Timer::~Timer(){
cout<<"Demolition of timer"<<endl;
}
class Bomb: public Timer{
public:
Bomb();
~Bomb();
};
Bomb::Bomb(){
cout<<"Install a timer in bomb"<<endl;
}
Bomb::~Bomb(){
cout<<"Bomb explode..."<<endl;
}
int main()
{
Timer* aTimer = new Timer;
Bomb* aBomb = new Bomb;
delete aTimer;
delete aBomb;
system("pause");
return 0;
}
到目前为止,我提出的是使用Eclipse的这些东西......
public class mainting{
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
}
}
public class bomb extends timer {
public bomb(){
System.out.println("Install a timer in bomb");
}
}
public class timer {
public timer()
{System.out.println("Install a timer");}
}
非常直接我知道。
这是C ++中代码的输出
Install a timer
Install a timer
Install a timer in bomb
Demolition of timer
Bomb exploded
Demolition of timer
答案 0 :(得分:1)
您可能希望在StackOverflow上查看此帖子 - 请仔细阅读,因为finalize()
与C ++析构函数不同!你无法假设它是否被调用,哪些对象仍然可用等等。
我不确定Java的finalize
是否被视为有害。
对于您考试的短程序,(如果您在Java版本中提供了finalize()
方法),GC不太可能会调用它。但是,你可以证明你知道它是如何工作的,以及C ++和Java w.r.t对象破坏之间的区别。
编辑:
在C ++程序中,最后三行输出与C ++ Timer对象的破坏相关联,然后与C ++ Bomb对象相关联,但行Demolition of timer
出现两次 - 我想你的教授可能正在尝试为了证明在C ++中,因为Bomb继承自Timer,所以析构函数按照大多数派生类的顺序调用到基类。
另一方面,C ++析构函数应该是virtual
,但你可能会在将来的某个时候学到它。
作为使用finalize()
功能的替代方法,您可以尝试这样做:
public class mainting{
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
atimer.destroy(); // since no destructor in Java, add a "destroy()" method
abomb.destroy();
}
}
public class bomb extends timer {
public bomb(){
System.out.println("Install a timer in bomb");
}
public void destroy(){
System.out.println("Bomb exploded");
super.destroy(); // destroy parent object
}
}
public class timer {
public timer()
{System.out.println("Install a timer");}
public void destroy() {
System.out.println("Destruction of timer");
}
}
答案 1 :(得分:0)
您可以使用try-with-resources或使用PreDestroy
注释。
答案 2 :(得分:0)
C ++需要析构函数来释放对象持有的资源。最常见的需求是处置动态分配的内存。
在Java中,动态分配的内存由垃圾回收自动处理。为此,不需要析构函数。
可以通过显式方法处理其他资源。您可以使用try-with-resources在finally
块或Java 7中调用此方法。无论如何,考虑实现类似java.io.Closeable
的接口,指示需要明确处理,并提供一种方法。
对于这个程序,主要方法的密切翻译将是:
public static void main(String test[])
{
timer atimer = new timer();
bomb abomb = new bomb();
try {
atimer.close();
abomb.close();
} catch ( java.io.IOException e ) {
System.err.println( "An error occurred." );
}
}