运行同一班5次

时间:2015-08-05 11:23:24

标签: java

我在java代码中编写了一个复杂的算法。但是,我想运行代码类5次,而不是自己动手。我通过T2类调用了T1类,并将T1类放入循环中5次。问题是Java保存代码的旧值并在下一个循环中使用它们。我的问题是如何在T1代码结束时每次使用新值(不使用静态变量为零)运行T1类5次。这是我所做的一个简单的例子:     包测试;

public class T1 {
    public static int n, m, o, i, j;
    public static double T;
    public static int[][]  V = new int[100][100];
    public static int[]  C = new int [100];

    public static void main(String[] args){
        m=o+1; n=o+1; o=m+n;
        for(j = 0 ; j < n ; j++){
            for(i = 0 ; i < m ; i++){
                V[i][j] = i+j+o;
                System.out.print(V[i][j]+"   ");
            }           
                System.out.print("\n");
        }
        System.out.println("--------");
        for(j = 0 ; j < n ; j++){
            C[j] = j+o;
            System.out.print(C[j]+"   ");
        }
        System.out.println("\n--------");
        System.out.println("o = "+o);
        System.out.println("*******************************");
    }
}
package Test;

public class T2 {
    public static void main(String[] args) {
        for(int i =0 ; i <5 ; i++){
            T1.main(args);
        }
    }
}

这些代码的结果是:

2   
--------
2   
--------
o = 2
*******************************
6   7   8   
7   8   9   
8   9   10   
--------
6   7   8   
--------
o = 6
*******************************
14   15   16   17   18   19   20   
15   16   17   18   19   20   21   
16   17   18   19   20   21   22   
17   18   19   20   21   22   23   
18   19   20   21   22   23   24   
19   20   21   22   23   24   25   
20   21   22   23   24   25   26   
--------
14   15   16   17   18   19   20   
--------
o = 14
*******************************

虽然我希望它们如下(没有在T1类的末尾放置o = 0):

2   
--------
2   
--------
o = 2
*******************************
2   
--------
2   
--------
o = 2
*******************************
2   
--------
2   
--------
o = 2
*******************************

3 个答案:

答案 0 :(得分:1)

您将T1中定义的所有内容都定义为static,这意味着变量绑定到类而不是类的实例。您需要从字段和方法中删除所有static说明符,并在每个循环迭代中创建一个新实例。另外,请不要将您的代码放在main中,而应放在其他非稳定的方法中。

for(int i =0 ; i <5 ; i++){
    new T1().process(args);
}

如果需要将所有变量保持为静态,可以引入static reset()方法,将所有变量设置为默认值(第一次调用之前的值),并在每次迭代后调用该方法。

答案 1 :(得分:0)

由于使用了static关键字,因此在每次迭代时都会更改属性的值。删除静态,它应该没问题,如果你不能在T1类中创建单独的方法,只需在T2中调用它来循环。

答案 2 :(得分:0)

我看到重置静态值的两种可能性

第一个也更容易的是保存旧状态,例如:克。

for(int i =0 ; i <5 ; i++){
    final int n = T1.n;

    T1.main(args);

    T1.n = n;
}

另一种选择是每次都使用不同的类加载器加载类T,因为JVM将为每个加载器保存一个 Class 实例,并且它们都有自己的静态字段。

Class<?> instance1 = /* some magic using classloaders */;
Method instance1 = c.getMethod("method", new Class[]{String[].class});
Object result = m.invoke(null, /*your args come here*/);

但我不认为这就是你想要的。

为什么不只是使所有字段非静态,然后创建新实例?

class T1 {
    private int n;

    T1() {
        n = 5;
    }

    void doSomething() {
        //do whatever you want with your variables here
    }

    public static void main(String[] args) {
        for (int i=1; i<5; i++) {
             T1 t1 = new T1();
             t1.doSomething();
        }
    }
}