如何访问其他类中的每个循环变量

时间:2017-09-13 08:02:21

标签: java

我是java的新手。我正在学习使用for-each循环迭代arraylist。

  for(String s:list){
my code
}

我想在同一个包的另一个类中访问变量s。制作方法静态后的事件我无法这样做。

我也尝试过如下初始化变量:

      static String s=null;

    for(s:list){
    my code

}

此代码也无效。请帮助我了解在另一个类中访问变量''的正确方法

4 个答案:

答案 0 :(得分:0)

如果要将变量传递给另一个类,请将该变量作为一个agrument传递给该类的方法。

例如: -

Class2 class2 = new Class2();
for(String s : list){
    class2.method(s);
}

答案 1 :(得分:0)

在java中的每个循环中,您将创建临时变量。

for (String s:list) {
  System.out.println(s);
}

和此:

for (int i = 0; i < list.size(); i++) {
  String s = list.get(i);
  System.out.println(s);
}

是等价的。在这两种情况下,您都无法访问for循环外部的变量s,这意味着即使在同一个类中也无法访问它,更不用说在其他地方的类外部访问它了。如果您想要访问文件外部列表的每个元素,为什么不使用该列表?你从哪里得到名单?我可以想到你从中得到的两个地方:

  1. 来自函数
  2. 这意味着您在函数内部创建列表,这意味着您无法访问函数外部的列表。如果您需要另一个类中列表的元素,则必须将它们放入类变量(数组或列表中)

    class MyClass {
    ArrayList<String> classVariableList;
    
    function myFunction() {
      //your list was created here
      classVariableList = list;
      for (String s:list) {
        //your code
      }
    }
    
    1. 来自类变量/参数
    2. 在这种情况下,我建议您也将此变量用于其他类。

      静态:

      因为你试图让一个变量static在你的类之外访问它:static只意味着一个变量的特征是“每个类一次”。这在类变量中最常用,对于类的每个实例都不必存在一次。这与您可以访问变量/ function / ....

      的位置无关

      但是,您也可以在示例中使用static。根据您想要访问其他类中列表元素的方式,它甚至可能是个好主意。

      如果您需要多个列表(例如,对于您的班级的每个实例都需要一次),那么您不应该使用静态列表。在这种情况下,您必须在每个对象中创建列表并使用以下命令访问它:

      instanceOfMayClass.classVariableList
      

      如果您只需要这个位置来访问函数外部列表的元素,那么您可以将类变量设置为静态(例如,当您不经常更新此列表并且它在您的类的所有实例之间共享时) 。在这种情况下,您可以通过键入

      来访问其他类中的列表
      MyClass.classVariableList
      

答案 2 :(得分:-1)

要从另一个类实例访问字段,您需要一个存储该类的实例的变量,并使用public访问(varName.fieldName)字段。

如果该字段是该类的静态成员,只需编写ClassName.fieldName

即可

答案 3 :(得分:-1)

您的公共/静态解决方案是错误的方向。在类级别公开公开局部变量以使其可用于单个其他对象类将减少类提供的封装,这是不好的。

这里的解决方案是通过方法调用传递变量:

public class ListProcessor {

    private StringProcessor stringProcessor;

    public ListProcessor() {
        stringProcessor = new StringProcessor();
    }

    public process(List<String> values) {
        for(String value : values){
            stringProcessor.process(value);
        }
    }
}

public class StringProcessor {
    public process(String value) {
        System.out.printf("Processing: %s%n", value);
    }
}

编辑:请注意,您可以使用实例或静态字段作为循环变量,尽管这样做通常是不好的做法:

public class FunWithFors {

    private static final int FOREVER = 42;
    private int instanceCounter = 25;
    private static int staticCounter;

    public static void main(String[] args) {

        useStaticCounter();

        FunWithFors instance = new FunWithFors();
        instance.useInstanceCounter();
    }

    private static void useStaticCounter() {
        System.out.println("Count from 0 to 3 using static counter");
        for (; staticCounter <= 3; staticCounter++) {
            System.out.println(staticCounter);
        }
    }

    private void useInstanceCounter() {

        System.out.println("Using instance counter:");

        System.out.println("Count down to 20");
        for (; instanceCounter >= 20; instanceCounter--) {
            System.out.println(instanceCounter);
        }

        System.out.println("Count from 1 to 5");
        for (instanceCounter = 1; instanceCounter <= 5; instanceCounter++) {
            System.out.println(instanceCounter);
        }

        System.out.println("Count from 1 until forever");
        for (instanceCounter = 1; ; instanceCounter++) {
            if (instanceCounter == FOREVER) {
                System.out.println("Cheat by breaking out of the iteration");
                break;
            }
        }

        System.out.println("Loop endlessly");
        for (; ; ) {
            System.out.println("Help! I'm stuck here");
        }
    }
}

输出:

Count from 0 to 3 using static counter
0
1
2
3
Using instance counter:
Count down to 20
25
24
23
22
21
20
Count from 1 to 5
1
2
3
4
5
Count from 1 until forever
Cheat by breaking out of the iteration
Loop endlessly
Help! I'm stuck here
Help! I'm stuck here
Help! I'm stuck here
Help! I'm stuck here
Help! I'm stuck here
Help! I'm stuck here
Help! I'm stuck here
(ad infinitum)

也可以通过将其设置为非私有或通过getter来从另一个类访问计数器的当前值。但是,正如所指出的,这不是一种好的做法。

相关问题