java - java如何处理非静态变量?

标签 java oop non-static

我在理解非静态变量的处理方式时遇到问题。我选择使用数组,以便轻松检索其内存地址。

考虑以下代码:

public class tryClass
{
    int[] v = {0}; // vector v is non-static (and NOT local to any method)
    tryClass obj;
    public void met ()
    {
        obj = new tryClass();
        obj.v[0] = 30;
        v[0]=3;
    }
    public static void main (String[] args)
    {
        tryClass obj = new tryClass(); // is this the SAME object as in met() ?
        int[] v = new int[1];
        obj.v[0] = 40;
        obj.met();
    }
}

为了了解 vector v 的每一步是如何处理的,我用一些 println 指令填充了代码,我的输出如下:

In main(), BEFORE running met()
    obj.v[0] = 40
    obj.v    = [I@78456a0c

INSIDE method met()
    obj.v[0] = 30
    v[0]     = 3
    obj.v    = [I@15357784
    v        = [I@78456a0c

In main(), AFTER running met()
    obj.v[0] = 3
    obj.v    = [I@78456a0c

我对很多事情很不解,首先就是为什么在静态方法main()中调用obj.v的引用是一样的v 在非静态方法 met() 中。此外,在没有对象的情况下(当然是在非静态上下文中)调用时 v 到底是什么?

我是 Java 的新手,我真的有无穷无尽的问题,我希望一个答案可以解决所有这些问题...在此先感谢您的帮助。

为了完整起见,完整代码为

public class tryClass
{
    int[] v = {0};
    tryClass obj;
    public void met ()
    {
        obj = new tryClass();
        obj.v[0] = 30;
        v[0]=3;
        System.out.println("\nINSIDE method met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tv[0]     = "+v[0]);
        System.out.println("\tobj.v    = "+obj.v);
        System.out.println("\tv        = "+v);
    }
    public static void main (String[] args)
    {
        tryClass obj = new tryClass();
        int[] v = new int[1];
        obj.v[0] = 40;
        System.out.println("In main(), BEFORE running met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tobj.v    = "+obj.v);
        obj.met();
        System.out.println("\nIn main(), AFTER running met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tobj.v    = "+obj.v);
    }
}

最佳答案

为什么在静态方法main()中调用obj.v的引用与在非静态方法met()中调用v的引用相同?

答案:因为你没有将它重新分配给内存中的不同对象。它仍然指向内存中的同一个“数组”对象,即使您在内部更改了数组的内容。

看看你的代码,加上我的评论:

public class tryClass
{
    // here, non-static variable v will be instantiated
    // as an array with a length of one, holding the value 0 in it's one slot;
    // it will be instantiated when an instance of tryClass is created.
    int[] v = {0};

    // here, this tryClass has another tryClass named "obj" in it as one of its fields.
    tryClass obj;

    public void met ()
    {
        // here, the tryClass's tryClass obj is instantiated
        // and this second tryClass's "v" is instantiated
        // and then it's one slot is set to 30.
        obj = new tryClass();
        obj.v[0] = 30;

        // now, the first tryClass's "v" is set to 3.
        v[0]=3;
    }

    public static void main (String[] args)
    {
        // creating a new tryClass.  This is NOT the same object as in met.
        // But it CONTAINS the same object in met.
        // You could call it by going obj.obj.
        tryClass obj = new tryClass(); // is this the SAME object as in met() ?  Answer: No.

        // this does nothing, it just creates another int[] v
        // that exists only inside the main() method.  It is not
        // the same as obj.v!
        int[] v = new int[1];

        // changing the contents of obj.v, but not reassigning obj.v itself.
        obj.v[0] = 40;

        // calling met, which will change obj.v's contents again, but not reassign it.
        obj.met();
    }
}

数组是可变的,这意味着即使它在内存中保持相同的对象,它的内容也可以改变。

关于java - java如何处理非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19162283/

相关文章:

java - 为什么我不能访问我的 jar 中的文件,除非我在运行它时位于 Jar 所在的文件夹中?

java - 计算 View 的宽度,以便它们始终适合屏幕

c# - .Net ORM/业务对象框架性能

c++ - 传递给对象时获取数组的长度

java - 将子项转换为父项 - 由于缺少方法而导致编译时错误 - 为什么?

c++ - 将非静态成员函数作为参数传递

c++ - 非静态成员变量创建类似于 C++ 中的静态单例创建

使用自定义函数的Java二元搜索

java - 任意数量集合的笛卡尔积

c# - Process.Kill非静态字段错误