[英]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.