6

これが C++ コードだとしましょう:

void change(int& x){
    x++;
}

また

void change2(int* a){
    *a++;
}

どちらもグローバル x を変更しますよね?

では、どうすればJavaでそのようなことを行うことができますか?
具体的にはVectorオブジェクトを指したいのですが

、Javaにはポインタがないのでどうしたらいいのかわかりません。
インターネットを検索すると、Java は別の方法でそれを行うと言っている人を見ましたが、実際の例は見つかりませんでした。

手伝ってくれてありがとう!

4

6 に答える 6

13

Java では、ポインタの代わりにオブジェクトへの参照があります。参照によってプリミティブ型を渡すことはできませんが、プリミティブ型をオブジェクト内にラップしてから、そのオブジェクトへの参照を渡すことができます。

Java はIntegerwraps という型を提供しますがint、この型は不変であるため、構築後にその値を変更することはできません。ただしMutableInt、Apache Commons から使用できます。

void change(MutableInt x) {
    x.increment();
}

x への変更は呼び出し元に表示されます。


具体的には、Vector オブジェクトをポイントしたい

あなたが書いているときは、変数へのベクトルへの参照Vector v = ...;を割り当てています。Java での参照は、ポインターに非常に似ています。参照は、実際にはポインタを使用して内部的に実装されています。v

Java は値渡しを使用します。ベクターをメソッドに渡すと、実際にはそのベクターへの参照がコピーされます。ベクター自体のクローンは作成しません。したがって、Java で参照を渡すことは、C++ でポインターを渡すことと非常によく似ています。

于 2012-04-15T08:36:55.013 に答える
4

Java では、参照渡しのようにプリミティブ型を渡すことはできませんint。それらは値によってのみ渡されます。

Objects代わりに参照によって渡されるため、できることはそれを行うための工夫を見つけることだけです。ここで 2 つの例を示します。

このように、単一の値の配列を使用します

int[] value = new int[1];
value[0] = 2;

// call a method
obj.setValue(value);

// and in setValue
public void setValue(int[] value) {
  value[0] = 5;
}

または 2 番目のアプローチでは、ホルダー クラスを使用します。

public class Holder<T> {
  public T value;
  public Holder(T value) {
    this.value = value;
  }
}

// then use it in this way
Holder<Integer> h = new Holder<Integer>(2);

obj.setValue(h);

// and in setValue
public void setValue(Holder<Integer> h) {
  h.value = 5;
}

この場合、ジェネリックを実装するホルダー クラスを使用しますが、単純なホルダーも整数に対してのみ使用できます。例えば:

public class IntHolder {
  public int value;
  public IntHolder(int value) {
    this.value = value;
  }
}
于 2012-04-15T08:46:32.243 に答える
1

Javaは常に値を渡し、C++の意味でのグローバル変数はありません。したがって、C ++と同じことをしたい場合は、新しい値を返す必要があります。

したがって:

public int change(int x) {
    return ++x;
    // or 
    // return x + 1;
}

それをテストするには:

int x = 2;

change(x);

System.out.println(x); // returns 2

x = change(x);

System.out.println(x); // returns 3

したがって、メソッドを呼び出させることは意味がありません。changeの線に沿った方が賢明ですcalculateThisInt


Javaはオブジェクトを値で渡します。しかし、Mark Byersが言及しているように、IntegerMutableIntクラスは不変であり、 ApacheCommonsライブラリから使用できます。これがどのように機能するかを説明するために、例として自分で実装できます。

public class MyInt() {

    public int i;

    public void setInt(int i) {
        this.i = i;
    }

    public int getInt() { 
        return this.i; 
    }

    public int increment() {
        this.i++;
    }

}

上記のオブジェクトを引数としてchange持つように関数を変更する必要があります。MyInt

public void change(MyInt i) {
    i.increment();
}

使用法:

MyInt x = new MyInt();
x.setInt(2);

change(x);

System.out.println(x.getInt); // returns 3

あなたの場合、Vectorオブジェクトを変更したい...

public void changeVector(Vector v) {
    // anything you do with 'v' will change it even
    // for the scope that called this method
}

// Usage:
Vector v = new Vector();
changeVector(v);
// v should be changed after calling change vector method

これがすべて理にかなっていることを願っています。

于 2012-04-15T08:39:45.933 に答える
0

関数に渡されたオブジェクトを置き換えることはできませんが、フィールドを直接変更するか、メソッドを呼び出すことで、その状態を変更できます。プリミティブへのポインターのようなものが必要な場合は、それをオブジェクトにラップします。コードに従うには、次のようにします。

public class IntPointer {
    public int value;
    public IntPointer(int value) {
        this.value = value;
    }
}

次に、他の場所で次のように言うことができます。

public static void change(IntPointer ipoint) {
    ipoint.value++;
}
public static void main(String[] args) {
    IntPointer a = new IntPointer(10);
    change(a);
}

これは少し厄介に思えるかもしれませんが、あなたが思っているほど頻繁には思い浮かびませんでした. 私は次のようなことをする可能性が高いでしょう:

public class ABPair {
    private int a = 0;
    private int b = 0;
    public static void changeA() {
        a++;
    }
    public static void changeB() {
        b++;
    }
}

他の場所で私が言うことができるように:

public static void main(String[] args) {
    ABPair ab = new ABPair();
    if (ACondition) {
        ab.changeA();
    }
}

言い換えれば、私のデータはすでにある種のオブジェクトにラップされている傾向があり、データ オブジェクトのメソッドを使用して変更を仲介する傾向があります。

于 2012-04-15T09:08:09.893 に答える
0

Java は、「参照」と呼ばれるものをサポートしています。参照は、C/C++ に似た言語のポインターのように機能します。それらは、それらの言語で「参照」が機能するのと同じようには機能しません。

C のポインターと Java の参照の主な違いは次のとおりです。

Java ではポインター演算を行うことはできません (つまり、Java 参照から「加算」または「減算」することはできません。それを逆参照するか、別のものと比較することしかできません)。互換性のない型にキャストすることはできません。Java は強力な型安全性を備えているため、メモリ内のバイトを他のオブジェクトとして「再解釈」することはできません。ポインターの一部の使用では、これは実際の効果がありません (たとえば、リンクされたリストは両方の言語でほとんど同じように機能します)、他の場合は違いが非常に大きくなります (C の配列は単なる手の込んだポインター演算であり、Java ではまったく異なる働きをします)。

したがって、ある意味では、Java 参照は「制限付きポインター」と呼ばれることがあります。

于 2017-11-27T15:03:03.283 に答える