C ++到Java转换 - 析构函数

时间:2013-04-17 18:55:54

标签: java c++ destructor

我需要将此程序转换为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

3 个答案:

答案 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-resourcesfinally块或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." );
    }
}