-1

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

3 回答 3

1

您可能想查看StackOverflow上的这篇文章- 但请仔细阅读,因为它finalize()与 C++ 析构函数不同!您不能对它是否被调用、哪些对象仍然可用等做出假设。

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

对于您在考试中的简短程序,(如果您finalize()在 Java 版本中提供了一个方法),GC 不太可能调用它。但是,您可以证明您知道它是如何工作的,以及 C++ 和 Java wrt 对象销毁之间的区别。

编辑:

在 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");
    }
}
于 2013-04-17T19:24:20.680 回答
0

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

于 2013-04-17T19:01:43.283 回答
0

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

在 Java 中,动态分配的内存由垃圾回收自动处理。为此,不需要析构函数。

其他资源可以通过显式方法处理。finally您可以在块中或在 Java 7 中使用try-with-resources调用此方法。无论如何,请考虑实现一个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." );
    }
}
于 2013-04-17T19:02:52.493 回答