我在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
*******************************
答案 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();
}
}
}