在类之间共享相同的变量

时间:2019-03-24 19:34:40

标签: java

我正在尝试创建一个系统,在该系统中可以从不同的类更改一个变量。我要创建的代码是这样的:

服务器:

public class Server(){

   public int number = 0;

}

客户

public class Client extends Server(){

   public void run (){
      number++;
   }
}

业务

public class Business(){

  public void run(){
    number++;
  }

}

我还有另一个类可实例化Client和Business类。当我打印出另一个类中的数字的结果仍然是0时,我试图理解如何从不同的类中操纵相同变量的概念。我是否必须扩展类,还有其他方法吗?

3 个答案:

答案 0 :(得分:0)

这是因为在您的情况下,number变量是一个实例变量,这意味着每个实例都具有自己的该原语副本。 通过阅读实例和类变量,您将获得更多的了解。 因此,如果通过添加number关键字将static变量作为类变量,则您的应用程序应该开始工作(假设您已解决编译错误)。

我还建议您阅读有关AtomicInteger的信息,这在多线程处理中会更加安全。

P.S。重写您的代码后,我得到以下代码:

class Test {
    public static void main(String... args) {
        Client c = new Client();
        c.run();
        Business s = new Business();
        s.run();
        Server ss = new Server();
        System.out.println(ss.number);
    }
}

class Server {
    public static int number = 0;
}

class Client extends Server {
    public void run() {
        number++;
    }
}

class Business extends Server {
    public void run() {
        number++;
    }
}

答案 1 :(得分:0)

您有一个简单的方法可以实现这一目标。

1)使用数字作为静态变量并访问该方法。 (使用同步方法为多线程应用程序增加值)

2)使用AtomicInteger递增。 (无需同步) (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html

如果您需要更多说明,请告诉我。

答案 2 :(得分:0)

您可以使用@Mikita Berazouski提到的上述解决方案。 或者,您可以使用静态方法。这样,您无需扩展服务器。

静态方法是Java中可以在不创建类对象的情况下调用的方法。它们由类名本身或对该类的Object引用。

您的解决方案将是这样:

public class Test {
    public static void main(String... args) {
        Client c = new Client();
        c.run();
        Business s = new Business();
        s.run();
        System.out.println(Server.number);
    }
}

class Server {
    public static int number = 0;
    public static void run ()
    {
        number ++;
    }
}

class Client  {
    public void run() {
        Server.run();
    }
}

class Business {
    public void run() {
        Server.run();
    }
}

尝试here上方的代码,您将检查结果。

另一种可能的解决方案是,在类Server中将number声明为static,是这样编写代码,这使您可以在每个类的空运行中进行比较:

public class Test {
    public static void main(String... args) {
        Client c = new Client();
        c.run();
        Business s = new Business();
        s.run();
        System.out.println(Server.number);
    }
}

class Server {
    public static int number = 0;
}

class Client  {
    public void run() {
        Server.number ++;
    }
}

class Business {
    public void run() {
        Server.number ++;
    }
}