c++到Java的转换-析构函数

C++ to Java Conversion - Destructors

本文关键字:析构函数 转换 Java c++      更新时间:2023-10-16

我需要把这个程序转换成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

你可能想看看这篇关于StackOverflow的文章-仔细阅读,因为finalize()与c++析构函数不同!!你不能假设它是否被调用,哪些对象仍然可用,等等。

我不确定Java的finalize是否被认为是有害的。

对于考试中的短程序,GC不太可能调用它(如果您在Java版本中提供了finalize()方法)。但是,您可以证明您知道它是如何工作的,以及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");
    }
}

c++需要析构函数来释放对象持有的资源。最常见的需求是处置动态分配的内存。

在Java中,动态分配的内存是由垃圾回收自动处理的。对于这种情况,不需要析构函数。

其他资源可以通过显式方法来处理。您可以在finally块中调用此方法,或者在Java 7中使用try-with-resources调用此方法。无论如何,考虑实现一个像java.io.Closeable这样的接口,它指示需要显式的处理,并提供一个方法来完成。

对于这个程序,main方法的近似翻译是:

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." );
    }
}

您可以使用try-with-resources或使用PreDestroy注释

相关文章: