2013-11-01 112 views
0

我幾天前開始學習Java。 我有一些C++的經驗,這就是爲什麼我習慣於指針,這會更容易。從公共靜態void main(String [] args)訪問變量

所以現在我的問題。

比方說,我有以下代碼:

public class Main { 

    public static void main(String[] args) { 

     int variable1=2, variable2=2; 

     input(variable1, variable2); 

     System.out.println(variable1 + " " + variable2); 
      // this should output "1 3" on the console 
    } 

    private static void input(int variable1, int variable2) { 

     System.out.println(variable1 + " " + variable2); 
      // this will output "2 2" on the console 

     variable1 = 1; 
     variable2 = 3; 
    } 
} 

因此函數input()從主要採取變量並輸出(正確)。 但是,如何將更改後的變量傳回主函數?

+1

在Java中,你應該使用'camelCase'變量名,否則我們都會很困惑。 –

+0

@JohannesKuhn IMO,這是相關的,但不是重複。這不是一個重複的問題,下面的答案都不重複。 –

+0

@Duncan我不想將問題作爲其他重複副本來關閉。 –

回答

1

正如其他人所說,基元是傳遞價值。你不能傳遞給他們的參考。但是,您可以傳遞任何Object的實例,並且(假設它是可變的)對其進行修改,並且這些更改將可用於具有對該實例的引用的任何作用域。

對於你的榜樣,你可以做兩件事情 - 使用數組...

public class Main{ 

    public static void main(String[] args){ 

    int[] values = {2, 2}; 

    input(values); 
    System.out.println(values[0] + ", " + values[1]); // prints 1, 3 
    } 

    private static void input(int[] values){ 
     values[0] = 1; 
     values[1] = 3; 
    } 
} 

或物體

public class ValueHolder{ 
    private int val1; 
    private int val2; 

    public void setValue1(int i){ val1 = i; } 
    public void setValue2(int i){ val2 = i; } 
    public int getValue1(){return val1;} 
    public int getValue2(){return val2;} 

    public String toString(){ 
      return String.valueOf(val1) + ", " + String.valueOf(val2); 
    } 
} 

public class Main{ 

    public static void main(String[] args){ 

    ValueHolder vh = new ValueHolder(); 
    vh.setValue1(2); 
    vh.setValue2(2); 
    System.out.println(vh); // prints 2, 2 
    input(vh); 
    System.out.println(vh); // prints 1, 3 
    } 

    private static void input(ValueHolder vh){ 
     vh.setValue1(1); 
     vh.setValue2(3); 
    } 
} 
1

在Java中,所有參數都按值傳遞,而不是通過引用傳遞。因此,上面的代碼不起作用。如果你想通過一個修改,你必須傳遞一個對象引用(通過值傳遞,但現在你傳遞該對象)。當然,你必須使用一個可變對象,例如一個集合。在你的情況下,你也可以傳遞一個整數數組。

當然:這一切都是糟糕的編程風格。您應該通過返回值傳遞結果,並儘可能使用更多功能的編程。

0
input(Variable1, Variable2); 

當調用該方法,所述兩個變量的值被複制到新定義的兩個變量int Variable1, int Variable2。你可以認爲它像這樣:

private static void input(int Variable1, int Variable2) { 
    Variable1 = 2; 
    Variable2 = 2; 

    System.out.println(Variable1 + " " + Variable2); // this will output "2 2" on the console 

    Variable1 = 1; // this is different from the one that is inside main() 
    Variable2 = 3; // this is different from the one that is inside main() 
} 

這裏是我的另一個問題,可能會幫助你理解的概念的答案通過按值:https://stackoverflow.com/a/9404727/597657

0

傳遞原語Java是通過價值完成的。

可以消除靜電的方法,並使用圖元作爲主要類的實例屬性,如下面所示:

public class Main { 
    int firstVariable = 1, secondVariable = 2; 
    // instance block of Main, prints the fields 
    { 
     System.out.println("First variable: " + firstVariable); 
     System.out.println("Second variable: " + secondVariable); 
    } 
    // main (static) method: initializes an instance of Main class and calls 
    // (now) instance method "changeInstanceFields", then prints the change 
    public static void main(String[] args) { 
     Main main = new Main(); 
     main.changeInstanceFields(); 
     System.out.println("First variable: " + main.firstVariable); 
     System.out.println("Second variable: " + main.secondVariable); 
    } 
    // instance method: accesses Main class' instance fields 
    public void changeInstanceFields() { 
     firstVariable = 1; 
     secondVariable = 3; 
    } 
} 

輸出:

First variable: 1 
Second variable: 2 
First variable: 1 
Second variable: 3 
0

集它像一個類變量

public class Main { 

public int variable1, variable2; 

public static void main(String[] args) { 

    Variable1=2; 
    Variable2=2; 

    input(Variable1, Variable2); 

    System.out.println(Variable1 + " " + Variable2); 
     // this should output "1 3" on the console 
} 

private static void input(int Variable1, int Variable2) { 

    System.out.println(Variable1 + " " + Variable2); 
     // this will output "2 2" on the console 

    Variable1 = 1; 
    Variable2 = 3; 
} 

}

0

int是原始類型http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。整數是拳擊詮釋。他們兩人都不改變他們的價值觀。而是創建新的對象。 但是,你可以用一個類包裝int值。見例如:

public class Main { 
int v; 

@Override 
public String toString() { 
    return "Main [v=" + v + "]"; 
} 

public static void main(String... strings) { 
    int v1 = 2; 
    int v2 = 3; 

    input(v1, v2); 
    System.out.println(v1 + " " + v2); 

    Integer i1 = 2; 
    Integer i2 = 3; 

    inputI(i1, i2); 
    System.out.println(i1 + " " + i2); 

    Main m1 = new Main(); 
    m1.v = 2; 
    Main m2 = new Main(); 
    m2.v = 3; 

    inputM(m1, m2); 
    System.out.println(m1 + " " + m2); 

} 

public static void input(int v1, int v2) { 
    v1 = 3; 
    v2 = 4; 
} 

public static void inputI(Integer v1, Integer v2) { 
    v1 = 3; 
    v2 = 4; 
} 

public static void inputM(Main v1, Main v2) { 
    v1.v = 3; 
    v2.v = 4; 
} 

}

輸出:

2 3 
2 3 
Main [v=3] Main [v=4] 
0

這是因爲變量的值被複制到輸入方法()。原始變量總是在方法之間複製。

相關問題