java - 对java中的内存感到困惑

标签 java pointers memory pass-by-reference

据我了解,java中的对象是通过引用传递的,或者更准确地说,对对象的引用是通过值传递的。那么,如果我声明一个字符串并将其传递到一个函数中,在该函数中更改该字符串的值,为什么原始字符串没有改变?例如:

class Thing 
{

    static void func(String x){ x = "new"; }

    public static void main(String [] args)
    {
        String y = "old";
        func(y);
        System.out.print(y);
    }
}

为什么 y 的值仍然是“旧的”?

编辑:为什么下面将事物的属性 x 设置为 90?

class Thing { int x = 0; 

static void func(Thing t){ t.x = 90; }

public static void main(String [] args){
    Thing something = null;
    something = new Thing();
    func(something);
    System.out.print(something.x);
}
}

最佳答案

首先,java 中的所有内容都是按值传递的。甚至引用也是按值传递的。

您创建了一个新的string文字,但没有在方法func()中返回它。

您正在修改传递的参数而不是原始字符串,因此您看不到更改。

你可能需要这个,

public static void main(String [] args)
    {
        String y = "old";
        y= func(y);
        System.out.print(y);
    }

 static String func(String x){ 
  x = "new";  
  return x
 } 

编辑评论:

不,它们并不相同。两种String方式之间有很多区别,特别是在内存方面。

阅读

编辑2:

在第一种情况下,您在 func 方法中创建了一个新的字符串文字,但在这里您正在修改引用。

完成后您的疑问就会澄清

  static void func(Thing t){
     t = new Thing(); //as like previous example
     t.x = 90;       // points to new one. Not the original.

    }

现在检查结果。

关于java - 对java中的内存感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19462944/

相关文章:

java - 调试 jetty 应用程序

C++ 如果我指向/引用/制作别名,我应该使用原始指针(而不是智能指针)吗?

java - Java中的文件大小与内存大小

php - 安全使用 PHP ini_set "memory_limit"

java - 为应用程序实现一个通用的观察者模式/监听器

java - 找不到主类,java错误

java - JSON 数组解析,其中键值对中缺少键

c++ - CUDA-Matlab 编译中 C++ 指针的问题

c++ - 为什么这个指针在其对象应该超出范围时有效? (以及其他一些奇怪的行为)

ruby - 是否可以从 Ruby 中的 String#split 函数返回卡住的、去重的字符串?