Java 在函数和返回值中修改类变量时的奇怪行为

Java 在函数和返回值中修改类变量时的奇怪行为,java,android,Java,Android,鉴于以下情况 public class MyClass { private String my_string = "bbb"; public MyClass() { this.my_string += testFunc(); System.out.print("my_string = " + this.my_string); } public String testFunc() { this.my_string

鉴于以下情况

public class MyClass {
    private String my_string = "bbb";

    public MyClass() {
        this.my_string += testFunc();
        System.out.print("my_string = " + this.my_string);
    }

    public String testFunc() {
        this.my_string += "aaa";
        return "ccc";
    }

    public static void main(String[] args) {
        MyClass my_class = new MyClass();
    }
}
输出:

my_string = bbbccc
预期:

my_string = bbbaaaccc
这是怎么回事?行
this.my_string+=“aaa”发生了什么事

this.my_string = this.my_string + testFunc();
因此:

testFunc()
可能会更改此.my_字符串,但这无关紧要,因为它返回
ccc
。因此,它转向:

this.my_string = "bbb" + "ccc";
此.my_字符串
现在将更改为
bbbccc
,因此您以前是否将其更改为
bbbaaa
并不重要。输出是正确的

this.my_string = this.my_string + testFunc();
因此:

testFunc()
可能会更改此.my_字符串,但这无关紧要,因为它返回
ccc
。因此,它转向:

this.my_string = "bbb" + "ccc";

此.my_字符串
现在将更改为
bbbccc
,因此您以前是否将其更改为
bbbaaa
并不重要。输出是正确的。

这是一件简单的java事情,当您调用
my\u string+=testFunc()
时,您不能再在方法中更改
my\u string
的值。。Java不会将对象的引用传递给方法,如
C
,因此副作用会按顺序应用,并且
my_string+=testFunc()
会覆盖
this.my_string+=“aaa”
所做的更改

为了达到预期效果,您必须将代码更改为:

String temp = testFunc();
my_string += temp ;

这是一件简单的java事情,当您调用
my_string+=testFunc()
时,您不能再更改方法中
my_string
的值。。Java不会将对象的引用传递给方法,如
C
,因此副作用会按顺序应用,并且
my_string+=testFunc()
会覆盖
this.my_string+=“aaa”
所做的更改

为了达到预期效果,您必须将代码更改为:

String temp = testFunc();
my_string += temp ;

这不是一个错误,而是一个概念性的JVM决策

当您在构造函数中调用该方法时,这意味着对象尚未创建,因此JVM不允许对其进行内部属性更改


您正在尝试修改一些不存在的东西(谈到面向对象的概念,而不是过程性的)

这不是一个错误,而是一个概念性的JVM决策

public class MyClass {
private String my_string = "bbb"; //my_string = bbb

public MyClass() {
    this.my_string += testFunc(); //my_string + returned string of testFunc()
    System.out.print("my_string = " + this.my_string);
}

public String testFunc() {
    this.my_string += "aaa"; // writing temporaly into my_string
    return "ccc"; ( // overwrite aaa with ccc
//my suggestion -> return this.my_string (+ or += dunno which one.. eating :D)"ccc"; instead of return "ccc";
}

public static void main(String[] args) {
    MyClass my_class = new MyClass();
}
当您在构造函数中调用该方法时,这意味着对象尚未创建,因此JVM不允许对其进行内部属性更改

您正在尝试修改一些不存在的东西(说到面向对象的概念,而不是过程的概念)

public class MyClass {
private String my_string = "bbb"; //my_string = bbb

public MyClass() {
    this.my_string += testFunc(); //my_string + returned string of testFunc()
    System.out.print("my_string = " + this.my_string);
}

public String testFunc() {
    this.my_string += "aaa"; // writing temporaly into my_string
    return "ccc"; ( // overwrite aaa with ccc
//my suggestion -> return this.my_string (+ or += dunno which one.. eating :D)"ccc"; instead of return "ccc";
}

public static void main(String[] args) {
    MyClass my_class = new MyClass();
}
}


}

这一行没有被忽略为什么有这么多的反对票而没有解释为什么?这一行没有被忽略为什么有这么多的反对票而没有解释为什么?不确定,因为如果你尝试这样做。my_string=testFunc()+这个.my_字符串
,输出将是
cccbbbaaa
。因此,在构造函数内部的testFunc中所做的修改没有被忽略。这里,只是这个.my_字符串在修改之前进行了评估(正如@Mark所说),而不是因为它还不存在。是的,所使用的值对于testFunc()来说已经过时了当在构造函数中使用时进行更改。这会使人们认为它被忽略,但这并不确定,因为如果您尝试执行此操作。my_string=testFunc()+这个.my_字符串,输出将是
cccbbbaaa
。因此,在构造函数内部的testFunc中所做的修改没有被忽略。这里,只是这个.my_字符串在修改之前进行了评估(正如@Mark所说),而不是因为它还不存在。是的,所使用的值对于testFunc()来说已经过时了当在构造函数中使用时进行更改。这使人们认为它被忽略了,但它不是。如果内存正常,函数在运算符之前求值,但是在函数
+=
之前求值似乎是
=this.my_string+
是经过评估的。你能提供一些参考吗?
a+=b
a=a+b
的翻译不是评估。从技术上讲,翻译中还隐藏了一个类型转换,但这不是重点。如果内存正常,函数在运行之前会进行评估但是,rators似乎在函数
testFunc()之前将
+=
计算为
=this.my_string+
是经过评估的。你能提供一些参考吗?
a+=b
a=a+b
的翻译不是评估。从技术上讲,翻译中还隐藏了一个类型转换,但这不是重点。