[英]Basic Java Returning Value
嘿,我真的对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。但是为什么无效?
在这两种方法中,变量d
是方法范围变量。 这意味着它仅可用于方法本身。 此外,这意味着变量d
实际上是两个单独的变量,每种方法中一个。 tryToChange
方法仅更改其自身的局部变量(在签名中声明为参数),而不会更改main
方法中的d
变量(这是一个单独的变量)。
因此在main
, d
将获得值5,并在整个执行过程中保持该值。 在tryToChange
,它将接收值5
,将值加1
并打印结果( 6
)。 返回时,将打印main
方法的d
变量(并且该变量不变,因此将打印5
)
在Java中,原始值(int,char等) by value
传递。 这意味着更改此类参数不会更改方法本身之外的任何内容。 另一方面,我们有一个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().
}
tryToChange
不返回值,它只是将其打印到out
。 out
输出5
,它是局部变量d
的值。 参见: is-java-pass-by-reference或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);
}
您的tryToChange()函数未返回任何值。 因此它是无效的。 很清楚,您正在调用tryToChange Function,该函数执行打印传递给它的值的任务。
第一:
java中的所有原语都是按值传递的,因此它仅将值传递给tryToChange
方法,而tryToChange
仅在递增后打印它,并且由于其返回类型为void
因此它不返回任何值。
第二:
在main
它只接受其局部变量d
并在本地打印。 这就是为什么输出是这样的。
tryToChange d = 6
tryToChange d = 5
您只需要更改代码
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;
}
输出:
Current value if d: 5
New value of d: 6
巡回赛的情况都不同。 首先,您需要了解return语句的用法。 “返回”语句始终返回该值。
在您的第一种情况下:
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不返回,而是返回(a + b)之和的c变量值。 因此,在这种情况下,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()方法定义获得d的值。
这里方法main()和tryTOChange()中的d变量是不同的。 因为d变量声明为局部变量。 因此,当main()方法调用两个d变量中的tryTochange()方法时,其值相同。 但是当d增加1时,由于范围不同,在main方法中d变量的值是5或在tryTOchange()中d变量的值是6。 因此,当tryToChange()中的sop print d打印6且在main方法中其打印5时,而tryTochange()方法在那里完成时,它不会向main方法返回任何值。 为什么主方法中的d变量具有值5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.