2016-04-18 3 views
-3

私は非常に愚かな疑問があるので、なぜreturn文を使うのですか?この方法でreturnステートメントを使用せずに、我々はまた、必要に得ることができます値 例として、上記の例ではなぜreturn文が必要なのですか

package testing; 

public class ReturnMethod { 
    static int a = 10; 
    static int b = 5; 
    static int c; 
    static int d; 

    public static void add() { 
     c = a + b; 

    } 

    public static int returnAddValue() { 
     d = a + b; 
     return d; 
    } 

    public static void main(String[] args) { 
     add(); 
     System.out.println("c: " + c); 
     int value = returnAddValue(); 
     System.out.println("value: " + value); 

    } 

} 

私はreturn文を使用するときに出力

c: 15 
value: 15 

は、だから私は疑問を持っています取得しています例の両方でなぜ必要なのか

答えて

0

値を返すメソッドが必要な場合は、return文を使用する必要があります。

いずれの場合も、両方の方法が機能します。
しかし、クラスのフィールドを別のクラスで変更したくない場合は、返すメソッドを使用できます。あなたは銀行口座関連のソフトウェアを作っているとき

たとえば、あなたはmoneyだけ見て、そしてないになりたいが、を変えました。だから、moneyをプライベートにしてお金を返すメソッドを作る。この方法では、他のクラスだけお金を参照してください、しかし変更それを参照することはできません。あなたはそれが戻り値の型をvoidとして有し、第2の1は、戻り値の型としてint型を持っているので

public static **void** add() 

public static **int** returnAddValue() 

最初のものは、何も返さない参照として

2

return statementでは、return valueをグローバル変数、外部変数、またはメンバ変数に保存する必要はありません。

ただし、return statementを使用しない場合は、それを追跡するために可変値outerの種類を準備する必要があります。

0

まず、あなたの機能は、異なっています。 最初に動作するのは、cがグローバル変数であるためです。

+0

が、これは質問 – Blip

0

結果をクラスの(静的な)変数に格納しないと、通常returnを使用します。

public class ReturnMethod { 
    static int a = 10; 
    static int b = 5; 

    public static void add() { 
     int c = a + b; 
    } 

    public static int returnAddValue() { 
     int d = a + b; 
     return d; 
    } 

    public static void main(String[] args) { 
     add(); 
     //not possible to access c here 
     //System.out.println("c: " + c); 
     int value = returnAddValue(); 
     System.out.println("value: " + value); 
    } 
} 

この変更された例では、add()メソッドの結果にアクセスする方法はありません。

おそらく約Scopes in Javaを読んでください。

+0

に答えていないが、私は出力、C取得しています:15、 値:15、それぞれの場合に同じである – DoubtClear

+0

あなたは静的変数に結果を保存しているうん、しかし、という理由だけでクラスの私の例を詳しく見てみると、クラスからcとdの変数定義が削除されていますので、mainメソッドでc(目的の結果)にアクセスする方法がないため、コメントアウトしました。 – Alex

+0

はいアレックスは正しいです – DoubtClear

0

あなたはクラス変数c &を持っています。これらの変数はクラスに関連付けられ、ヒープに格納されます。値を戻す場合は、明示的なreturn文を使わずにアクセスできます。しかし、メソッドの中でdを宣言した場合は、呼び出し側に値を返すためにreturnステートメントが必要です。

1

静的変数にメソッドの結果を代入すると(実際に静的変数を設定してメソッドの「パラメータ」を渡すと)、そのメソッドが2つのスレッドによって同時に呼び出されると問題が発生します。変数は、メソッドのすべての呼び出しのために共有されている:あなたが最初に実行するこれらのスレッドのどちらか、またはそれらを同時に実行しても分からない

Thread t1 = new Thread(() -> {a = 1; b = 2; add(); }); t1.start(); 
Thread t2 = new Thread(() -> {a = 3; b = 4; add(); }); t2.start(); 
t1.join(); t2.join(); 

。したがって、add()を呼び出したときにaまたはbの値が何であるのかわからず、後でcの値が第1または第2のスレッド(またはそれらの混合物)で呼び出した結果であるかどうかわからない場合は、 。

このコード外同時にadd()を呼び出すある他のスレッドがある場合、その後cに格納された値は、35又は7のいずれか(または任意の他の値であってもよい。

スレッドのこの問題あなたがメソッドのパラメータとしてabを渡して、戻り値として結果を受信することにより、スタックにローカライズされた値を保持する場合、干渉は、ちょうど完全に消える。


コードがシングルスレッドであっても、書くために持っているだけで醜いです:

a = 1; 
b = 2; 
add(); 
int result = c; 

ではなく

int result = add(1, 2); 
+0

+1これは静的変数を使用してその結果を格納するコードが抱えている危険性を説明する唯一の答えであるためです。 – Madhusudhan

0

あなたはクラス変数cの値にアクセスすることができる理由は、静的として初期化されていることを示します。これが当てはまらなかった場合、addメソッドが終了すると直ちにc変数の情報が失われます。理由のメソッドが戻り値を持つのは、オブジェクトデータに操作があれば、ユーザーは更新された値を取得できるということです。この場合、非常に小さいものがあります。データに一連の操作がある場合はどうなりますか?その場合、最終的な値は呼び出しステートメントが不可能な呼び出しオブジェクトに返されなければなりません。

0

コードスニペット内の変数Cは、クラス全体でアクセスされ、クラスのオブジェクトが存在するまで保持されます。したがって、メソッドの外で変数Cの値を出力することができます。

ただし、メソッドadd()にローカル変数を宣言していた場合は、print文System.out.println("c: " + c);が変数cのデフォルト値を出力します。この場合はゼロです。

0

私たちのメソッドから値を返すかインスタンス変数を更新するかは、私たちの要件に完全に依存します。値を処理して結果を戻したい場合、結果は別の方法で使用されます。この場合、メソッドから値を返す必要があります。例えば

java.lang.Math.sqrt(ダブルA)メソッドは値を返すと、私たちは私たちのニーズや要件ごとのように返された値を使用します。このメソッドが何らかの値を返していない場合、それを更新する必要があると思いますか?このメソッドは値が返されなければ役に立たないと思います。

関連する問題