簡體   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