首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行相同的类5次

运行相同的类5次
EN

Stack Overflow用户
提问于 2015-08-05 11:23:23
回答 3查看 517关注 0票数 0

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

代码语言:javascript
复制
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("*******************************");
    }
}
代码语言:javascript
复制
package Test;

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

这些守则的结果是:

代码语言:javascript
复制
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类的末尾):

代码语言:javascript
复制
2   
--------
2   
--------
o = 2
*******************************
2   
--------
2   
--------
o = 2
*******************************
2   
--------
2   
--------
o = 2
*******************************
EN

回答 3

Stack Overflow用户

发布于 2015-08-05 11:30:31

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

代码语言:javascript
复制
for(int i =0 ; i <5 ; i++){
    new T1().process(args);
}

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

票数 1
EN

Stack Overflow用户

发布于 2015-08-05 11:30:23

由于使用了静态关键字,所以每次迭代时都会更改属性值。如果不能在T1类中创建单独的方法,只需在T2 for循环中调用它,就可以删除静态。

票数 0
EN

Stack Overflow用户

发布于 2015-08-05 11:42:52

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

第一个也是更容易的办法是拯救你的旧状态,例如。

代码语言:javascript
复制
for(int i =0 ; i <5 ; i++){
    final int n = T1.n;

    T1.main(args);

    T1.n = n;
}

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

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

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

为什么不直接使用来创建所有字段--非静态,然后创建新的实例?

代码语言:javascript
复制
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();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31831125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档