繁体   English   中英

跨类共享相同的变量

[英]Sharing same variable across classes

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

服务器:

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,我试图理解如何从不同的类操作相同的变量的概念。 我是否还要扩展课程,还有其他方法吗?

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

我还建议您阅读有关AtomicInteger ,这在多线程中会更安全。

PS重写代码后,我得到以下代码:

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)使用number作为静态变量并访问该方法。 (使用Synchronized方法增加多线程应用程序的值)

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

如果您需要更多解释,请告诉我。

您可以使用@Mikita Berazouski上面提到的解决方案。 或者您可以使用静态方法 像这样你不需要扩展Server。

静态方法是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();
    }
}

试试上面的代码, 在这里 ,你会检查结果。

另一种可能的解决方案,因为你在类Server中将number声明为static是写这样的代码,这允许你在每个类的void run中做diff事情:

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 ++;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM