我用java代码编写了一个复杂的算法。但是,我想不自己运行代码类5次。我通过T1类调用了T2类,并将T1类循环了5次。问题是Java保存代码的旧值,并在下一个循环中使用它们。我的问题是如何每次运行T1类5次,每次在T1代码末尾使用新值(静态变量不使用零)。下面是我所做的一个简单的例子: package;
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
*******************************虽然我希望它们如下所示(没有将o=0放在T1类的末尾):
2
--------
2
--------
o = 2
*******************************
2
--------
2
--------
o = 2
*******************************
2
--------
2
--------
o = 2
*******************************发布于 2015-08-05 11:30:31
在T1中将所有变量定义为static,这意味着变量绑定到类,而不是类的实例。您需要从字段和方法中删除所有static说明符,并在每个循环迭代中创建一个新实例。另外,也不要将代码放在main中,而是使用其他方法,wich不是staitc。
for(int i =0 ; i <5 ; i++){
new T1().process(args);
}如果需要使所有变量保持静态,可以引入一个static reset()方法,其中将所有变量设置为其默认值(第一次调用之前的值),并在每次迭代后调用该方法。
发布于 2015-08-05 11:30:23
由于使用了静态关键字,所以每次迭代时都会更改属性值。如果不能在T1类中创建单独的方法,只需在T2 for循环中调用它,就可以删除静态。
发布于 2015-08-05 11:42:52
我看到了两种重置静态值的可能性
第一个也是更容易的办法是拯救你的旧状态,例如。
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();
}
}
}https://stackoverflow.com/questions/31831125
复制相似问题