每次此循环运行时是否实例化新对象?

时间:2018-02-13 03:48:28

标签: java

我今天正在接受Java测试,我得到了这个奇怪的问题,我觉得我是对的,但我的一些同学说的是另一个答案是正确的。有一个基本类,一个初始化实例的默认构造函数,以及一些方法。在主类中,有一些像这样的代码(不完全是因为我不记得了。假设书面的类名是“测试者”。

public class Testing {
    public static void main(String[] args) {
        int x = 0;
        Tester t = new Tester ();
        Tester a;

        do {
            new Tester (); 
            x++;
        }while (x < 10);    
    }    
}

问题是,一旦程序完全执行,实例化了多少个对象。

我的逻辑是,在循环外部实例化了一个对象。在循环内部,有另一个对象,但每次循环运行时,一个对象才被重新实例化。循环没有创建新对象。所以,我说只有两个对象在程序运行完成后才会被实例化,但是我的一些同学说它是11.技术上,什么是正确的?

3 个答案:

答案 0 :(得分:0)

new Tester()行做了几件事

  1. 分配足够的内存来存储Tester实例
  2. 调用构造函数(设置默认值)
  3. 返回指向新对象的引用指针,因此您可以像对t
  4. 那样分配它

    对于t执行这些步骤一次,并且对于每个循环执行再次执行这些步骤,总共是“实例化”测试程序的11倍。所以你的同学是对的。

    当垃圾收集器运行时,每个Tester实例都将被删除。循环中的那些因为它们没有保存在变量中。例程退出后,可以删除存储在t中的那个。

    这就是为什么在为任何类调用new xyz()时应该谨慎,特别是在循环中。它通常很昂贵。特别是分配步骤。当然是is a tradeoff

    这是计算机完全按照您的要求执行操作的一个很好的示例。你期望它做的更接近:

    public static void main(String[] args) {
        int x = 0;
        Tester t = new Tester();
        Tester a = new Tester();
    
        do
        {
            a.Reinitialise(); 
            x++;
        }
    
        while (x < 10);
    
    }
    

    此处假设您在Reinitialise内创建了一个方法Tester

答案 1 :(得分:0)

要测试它,可以在Test类中声明一个静态int计数器,并在构造函数中增加静态计数器的计数并打印该值。

执行后检查计数器的值。

顺便说一句..它会创建11个对象..试一试。

答案 2 :(得分:0)

11是正确答案......每当你调用new时,它都会创建并实例化对象......

Tester a;

不实例化对象......它只是标记分配给此变量的对象应该是测试人员类型

最好注意的是在构造函数中编写一个print语句,然后只计算打印数量......