[英]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.