我正在尝试创建一个系统,在该系统中可以从不同的类更改一个变量。我要创建的代码是这样的:
服务器:
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时,我试图理解如何从不同的类中操纵相同变量的概念。我是否必须扩展类,还有其他方法吗?
答案 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 ++;
}
}