【问题标题】:java - access incremented static variable from another classjava - 从另一个类访问递增的静态变量
【发布时间】:2013-08-19 20:13:40
【问题描述】:

我有一个静态变量并在类中更新它的值。但是当我从另一个类访问这个变量时,它会显示未更新的值。

A类

  public static int postID = 1;

  public static String Creator()
  {
    String message = "POST id="+postID;
    return message;
  }

  void updatePostID()
  {
      postID++; //this function is being called each 10 seconds
  }

  @Override
  public void start() { 
    handler.post(show);
  }

  Handler handler = new Handler();
  private final Runnable show = new Runnable(){
    public void run(){
        ...
               updatePostID();
               handler.postDelayed(this, 10000);    
    }
  };

B 级

  String message = A.Creator(); //this always prints postID as 1 all time 

我需要一个可以从每个类访问并更新其值的全局变量。等待您的帮助(我将其与 Android 服务一起使用)

【问题讨论】:

  • 这甚至不是有效的 java 语法
  • 什么是函数work()?这甚至不是有效的输入?!
  • 这只是一个例子.. 我的意思是我正在更新它在函数中的值
  • 写出你正在使用的确切代码 - 毕竟,这是相当短的代码量
  • 我假设您正在调用工作方法?

标签: java android static static-members


【解决方案1】:

这是经过测试的代码。

public class A {

    public static int id = 0;

    public static int increment(){
        return A.id++;
    }

}

public class B {

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(A.increment());
        }

    }
}

【讨论】:

  • @dracula:是的。你确定你已经完全复制了那个代码吗?
  • 添加 volatile 到 public static int postID = 1;
【解决方案2】:

A 级 { 静态 int id=0;

//I am updating id in my function ,
{
  id++;
 }
}

公共类起点{

public static void main(String... args){

    A a = new A();
    A b = new A();

    System.out.println(A.id);
    System.out.println(a.id);
}

}

【讨论】:

  • 我认为您需要检查您的代码。这不会做你想做的事 - 你为什么要创建两个 A 类对象,然后静态引用它(静态块太可怕了!把它放在一个方法中)。
  • 只是一个反例,每次创建新实例都会增加价值
  • 你还没有解释过。此外,当不使用对象并且静态访问 int 时,通过创建类的新对象来增加 int 是非常违反直觉的。
【解决方案3】:

你需要调用work来执行id++;

class B {

    public static void main(String... args){

        A a = new A();
        a.work(); // You need to call it to apply add operation

        System.out.println(A.id); // Prints 1

    }

}

这是一个示例A类:

class A {

    static int id = 0;

    public void work(){

        id++;

    }
}

将 A 类保存在名为 A.java 的文件中,将 B 类保存在名为 B.java 的文件中。

然后编译B。由于B创建了类A的实例,所以A会被编译,你不需要单独编译A-

javac B.java

编译后,执行/运行-

java 乙

【讨论】:

    【解决方案4】:

    Sajal Dutta 的回答完美地解释了这一点,但如果你想让它全部保持静态(即不创建任何 A 类对象,你可以将代码稍微修改为:

    class A {
        static int id = 0;
        public static void work(){
            id++;
        }
    }
    

    然后:

    class B {
        public static void main(String[] args){
            System.out.println(A.id);
            A.work();
            System.out.println(A.id);
        }
    }
    

    这会产生:

    0
    1

    编辑(关于您更新的问题)

    你在哪里指定静态int的更新?从您提供的代码中,您要做的就是一遍又一遍地打印出相同的 int,因为永远不会调用包含增量过程的方法。

    编辑 2:

    试试这个:

    变化:

    handler.post(show);
    

    到:

    handler.postDelayed(show, 10000);
    

    【讨论】:

    • 正如我在 cmets 中所写,我使用每 10 秒运行一次的处理程序调用 updatePostID()。
    • 处理程序没有任何问题。你明白我的问题。如果我在 A 类中访问 postID,它会给我增加的值,如果从 B 类调用它,它会给出 1,但它通常是 5(只是一个例子)
    猜你喜欢
    • 2012-05-04
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多