0

パラメータ変数を別の変数に格納せずに、関数の外部で使用するにはどうすればよいでしょうか? 例: ユーザー入力による値をパラメーターとして読み取りたい場合は、SAY ??

public class CC {

    public int f(int a, int b) {
        int d, c;
        d = a;
        c = b;
        return a + b;
    } // want to use a & b outside

    public int q(int a, int b) {
        return a + b; // re-initial-is- will delete the previous parameter value;
    }

    public int w() {
        int p = a + b; // error:cannot access or resolve a & b into variables
        return p;
    }

    public int e() {
        int u = d + c; // works but this is not the solution
        return u;
    }

    public static void main(String args[]) {
        CC obj = new CC();
        obj.f(3, 4);
        obj.q(8, 9);
        obj.w();
        obj.e();
    }

}
4

2 に答える 2

4

パラメータ変数を別の変数に格納せずに、関数の外部で使用するにはどうすればよいでしょうか?

不可能です。ローカル変数のスコープは、それらが宣言されているメソッドに限定されます。すべてのローカル変数は、そのメソッドのスタック フレームに格納されます。メソッドが戻ると、スタック フレームが破棄されるため、すべてのローカル変数とパラメーターが失われます。

JVM 仕様からの引用- フレーム:

フレームは、データと部分的な結果の格納、動的リンクの実行、メソッドの戻り値、および例外のディスパッチに使用されます。

メソッドが呼び出されるたびに、新しいフレームが作成されます。フレームは、そのメソッド呼び出しが完了すると、その完了が通常の完了であるか突然の完了であるかにかかわらず、破棄されます (キャッチされない例外がスローされます)。フレームは、フレームを作成するスレッドの Java 仮想マシン スタック (§2.5.2) から割り当てられます。各フレームには、ローカル変数の独自の配列 (§2.6.1)、独自のオペランド スタック (§2.6.2)、および現在のメソッドのクラスの実行時定数プール (§2.5.5) への参照があります。 .


そうは言っても、それはあなたのクラスのフィールドのように見えますし、そうあるべきですab次に、コンストラクターに引数を渡すか、setter メソッドを使用して、それらを設定します。これがオブジェクト指向コードの書き方です。Classes に関する Oracle チュートリアルを参照してください。

たとえば、単純なクラスを取ります。

class Operation {
    private int a;
    private int b;

    public Operation(int a, int b) { 
        this.a = a; this.b = b;
    }

    public int sum() {
        return a + b;
    } 
}

次に、引数を渡してこのクラスのインスタンスを作成します。これは後でsum()メソッドで使用されます。

Operation operation = new Operation(4, 5);
System.out.println(operation.sum());

この線に沿ってクラスを変更できます。また、クラスと変数に適切な名前を付けてください。標準の Java 命名規則にも従ってください。

于 2013-09-25T16:01:15.303 に答える
0

とのフィールドを作成し、パラメータで初期化します。abf()

たとえば、次のようにします。

public class CC{

private int a;
private int b;
private int d;
private int c;

public int f(int a,int b)
 {
  d=a;
  c=b;
  this.a = a;
  this.b = b;
 return a+b; 
 } //want to use a & b outside

public int q(int a, int b)
 {
   return a+b; //re-initial-is- will delete the previous parameter value;
  }

public int w(){
 int p=a+b; //error:cannot access or resolve a & b into variables
 return p;
 }

public int e(){
 int u=d+c; //works but this is not the solution

 return u;
}

 public static void main(String args[]){
 CC obj=new CC();
 System.out.println(obj.f(3,4));
 System.out.println(obj.q(8,9));
 System.out.println(obj.w());
 System.out.println(obj.e());
 } 
}

これにより、以下がコンソールに出力されます。

7
17
7
7

ただし、フィールドの使用法は、何をしようとしているのかによって異なります。

たとえば、abを 1 回 ( a + bの計算に) 使用した後、それらを新しい値でリセットし、古い値と新しい値の両方を使用できるようにする場合は、次のようにする必要があります。

package test;

public class CC {

private int a;
private int b;
private int d;
private int c;

public int f(int initialA, int initialB) {
    this.a = initialA;
    this.b = initialB;
    return a+b; 
} //want to use a & b outside

public int q(int resetA, int resetB) {
    // Move values for a + b to other variables for re-use
    this.c = a;
    this.d = b;
    this.a = resetA;
    this.b = resetB;
    return a+b; //re-initial-is- will delete the previous parameter value;
}

public int w() {
    // Use the initial values
    int p = c + d;
    return p;
}

public int e() {
    // Use the reset values
    int u = a + b; //works but this is not the solution
    return u;
}

public static void main(String args[]){
    CC obj = new CC();
    System.out.println(obj.f(3,4));
    System.out.println(obj.q(8,9));
    System.out.println(obj.w());
    System.out.println(obj.e());
} 
}

これにより、以下がコンソールに出力されます。

7
17
7
17
于 2013-09-25T16:11:59.697 に答える