为什么java从另一个类中获取一个类的旧变量值?

为什么java从另一个类中获取一个类的旧变量值?,java,Java,分为两类: public class Main { int a = 4; Second second = new Second(); public static void main(String[] args) { Main main = new Main(); main.doAll(); } public void doAll() { second.printInt(); secon

分为两类:

public class Main {
    int a = 4;
    Second second = new Second();

    public static void main(String[] args) {
        Main main = new Main(); 
        main.doAll();
    } 

    public void doAll() {
        second.printInt();
        second.printInt2();

        a = 5;

        second.printInt();
        second.printInt2();
    }
} 

其结果是:

a from printInt1: 4
a from printInt2: 4
a from printInt1: 4
a from printInt2: 4
正如您所看到的,
a
对于
Second
的方法没有改变。但我不明白为什么会这样。我是这样看的:

  • 第二个实例在主目录中创建
  • 第二种方法从Main调用
  • Second的方法创建新的主实例并打印a=4
  • 第二个方法再次调用,再次创建主实例并打印新的实例的
    a
    (所以应该是5)
  • 但它永远不会改变。我是Java新手,所以我真的找不到这个逻辑中的错误


    UPD:这里也回答了这个问题:,因为我不能删除我的答案,这是因为您引用了
    Main()
    类中的变量
    a
    Main()
    类中的值设置为4

    在打印方法中,您可以创建新的
    Main()
    对象(
    Main=newmain();
    )。然后您将引用这些已创建的
    Main()
    对象的变量
    a
    ,其值为4


    a
    在名为
    doAll()的方法中设置为5
    。它仅在该方法内部有效,但在外部无效。

    printInt
    printInt2
    中,您创建一个新的
    Main
    方法并访问该实例
    a
    。由于在构造过程中,
    a
    将始终设置为
    4
    ,这是您看到的唯一值

    如果希望
    printInt
    printin2
    访问在
    Main
    方法中创建的
    Main
    实例的
    a
    字段,则需要以某种方式将其传递给它们

    一个选项是
    Second
    构造函数中的参数(即
    newsecond(main)
    ),在这种情况下,您需要在
    Second
    中的字段中保留该参数


    另一个需要较少更改的选项是,只需将要直接使用的
    Main
    实例传递给
    printInt
    /
    printInt2
    方法:
    second.printInt(Main)

    ,在第二个类add中

    public class Second {
    
        public void printInt() {
            Main main = new Main();
            main.doAll();
            System.out.println("a from printInt1: " + main.a);
        }
    
        public void printInt2() {
            Main main = new Main();
            main.doAll()
            int a = new main.a;
            System.out.println("a from printInt2 " + a);
        }
    }
    

    这是因为您正在方法中创建Main类的新实例。每个新实例都将变量
    a
    设置为4Try this,当声明a=5时,请尝试此操作。a=5您必须理解字段属于对象(非静态)的含义。您可能会假设只有一个
    a
    。。。但是没有。当你把
    static
    放在
    a
    声明的前面时,整个故事都变了。试试我的回答:}Yeshwin Verma程序员,Iit不起作用(
    public class Second {
    
        public void printInt() {
            Main main = new Main();
            main.doAll();
            System.out.println("a from printInt1: " + main.a);
        }
    
        public void printInt2() {
            Main main = new Main();
            main.doAll()
            int a = new main.a;
            System.out.println("a from printInt2 " + a);
        }
    }