繁体   English   中英

Java基本返回值

[英]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变量(这是一个单独的变量)。

因此在maind将获得值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().
}
  1. tryToChange不返回值,它只是将其打印到out
  2. 基元在java中按值传递,因此第二次打印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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM