嘿,我真的对java中的回报感到困惑。请帮助我解决我的痛苦...提前谢谢:)
public static void main(String[] args){
System.out.println(addThem(1,2));
}
public static int addThem(int a, int b){
int c = a + b;
return c;
}
我可以理解,在上面的代码中返回" c"作为添加的新变量/结果。 这是让我混淆>>
的另一种方法public static void main(String[] args){
int d = 5;
tryToChange(d);
System.out.println("tryToChange d = " + d);
}
public static void tryToChange (int d){
d = d + 1;
System.out.println("tryToChange d = " + d);
}
当我尝试执行此代码时,它返回
tryToChange d = 6
tryToChange d = 5
它显示方法中的值" tryToChange"返回5 + 1的值,它也返回value。但为什么它是无效的?
答案 0 :(得分:1)
在这两种方法中,变量d
是方法范围变量。这意味着它仅适用于方法本身。此外,这意味着变量d
实际上是两个独立的变量,每个方法一个。方法tryToChange
仅更改它自己的局部变量(在签名中声明为参数),它不会更改d
方法中的main
变量(这是一个单独的变量)。
因此,在main
中,d
将获得值5,并在整个执行过程中保持此值。在tryToChange
中,它会收到值5
,向其添加1
并打印结果(6
)。返回后,d
- main
方法的5
- 变量将被打印(并且不会更改,因此会打印by value
。)
在Java中,传递原始值(int,char等)by reference
。这意味着更改此类参数不会更改方法本身之外的任何内容。另一方面,我们传递public void a() {
final List<String> myList = new ArrayList<>();
b(myList);
}
public void b(List<String> something) {
something.add("something"); //Changes myList in a().
something = new ArrayList<>(); //Does nothing to myList in a().
}
,它适用于对象(例如列表),这意味着您实际上可以修改列表本身(但不是在调用方法中保存列表的变量。)
{{1}}
答案 1 :(得分:1)
tryToChange
不会返回值,只会将其打印到out
。out
会打印5
,这是局部变量d
的值。请参阅:is-java-pass-by-reference-or-pass-by-value 你可以将int
“包装”在一个类中,看看如何通过引用传递(实际上它仍然通过值传递,但引用是值)表现如下:
class IntWrapper {
public int d;
public IntWrapper(int d) {
this.d = d;
}
}
public static void main(String[] args){
IntWrapper wrapper = new IntWrapper(5);
tryToChangeWrapped (wrapper); // will print 6
System.out.println("tryToChange d = " + wrapper.d); // will print 6
}
public static void tryToChangeWrapped (IntWrapper wrapper){
wrapper.d = wrapper.d + 1; // or wrapper.d += 1 or wrapper.d++
System.out.println("tryToChangeWrapped d = " + wrapper.d);
}
答案 2 :(得分:0)
您的tryToChange()函数未返回任何值。因此它是无效的。 很明显,你正在调用tryToChange函数来执行打印传递给它的值的任务。
答案 3 :(得分:0)
<强>首先强>
java中的所有原语都是按值传递,因此它只是将值传递给方法tryToChange
,而tryToChange
只是在递增后打印它也不会返回任何值,因为它的返回类型是void
。
<强>第二强>
在main
中,它只需要本地变量d
并在本地打印。这就是输出的原因。
tryToChange d = 6
tryToChange d = 5
答案 4 :(得分:0)
您只需要更改代码
public static void main(String[] args) {
int d = 5;
System.out.println("Current value if d: " + d);
d = tryToChange(d);// assign returning value to d
System.out.println("New value of d: "+d);
}
public static int tryToChange(int d) { // needs to return value from here
d = d + 1;
return d;
}
Out put:
Current value if d: 5
New value of d: 6
答案 5 :(得分:0)
在你的第一个案例中: -
public static void main(String[] args){
System.out.println(addThem(1,2));
}
public static int addThem(int a, int b){
int c = a + b;
return c;
}
您正在调用addThem()方法。添加两个值,并将总和存储到c变量中,然后接下来返回变量c。但实际上变量c没有返回,但是c变量值是(a + b)的总和。所以在这种情况下,jvm返回变量c的值而不是变量c。
在你的第二个案例中: -
public static void main(String[] args){
int d = 5;
tryToChange(d);
System.out.println("tryToChange d = " + d);
}
public static void tryToChange (int d){
d = d + 1;
System.out.println("tryToChange d = " + d);
}
现在你正在调用tryToChange()方法。因为当这个方法被调用时,它取变量d的值而不是变量d。和tryTOChange()方法defination获取d的值。
这里d方法main()和tryTOChange()中的变量都不同。因为d变量声明为局部变量。 所以当main()方法调用tryTochange()方法时,两个d变量都具有相同的值。但是当d加1时,main方法中的d变量值为5,或者tryTOchange()因为范围不同而为6。因此,当tryToChange()中的sop print d打印6并且在main方法中它打印5.并且当tryTochange()方法在那里完成时,它不会向main方法返回任何值。为什么main方法中的变量值为5