2

私はC++からJavaに移行していますが、Javaで、配列が作成されたメソッドの外でどのように持続するかを理解するのに問題があります。以下のこの単純なコードを見てください。

public static int[] arrayMethod(){
    int[] tempArray = {1, 2, 3, 4};
    return tempArray;
}

public static void main(String[] args){
    int arr[] = arrayMethod();
    for(int i : arr){
        System.out.println(i);
    }
}

C ++では、配列がnew演算子で動的に割り当てられない限り、配列はメソッド内でローカルに作成されたため、呼び出し後には存在しません。私が理解しているように、Javaは常に値で渡され、配列は参照型であるため、私のc ++ロジックは、ローカルで作成された配列への参照を返すことを教えてくれます。私は何が欠けていますか?

4

4 に答える 4

7

おそらくこれはあなたが理解するのに役立つでしょう。

Javaでは、これは次のとおりです。

int[] tempArray = {1, 2, 3, 4};

これとまったく同じことを意味します:

int[] tempArray = new int[]{1, 2, 3, 4};

最初の形式には暗黙 があります。new

Javaでは、すべての配列はヒープオブジェクト/参照です。また、配列がメソッドに渡されると、参照が処理されるのと同じ方法で処理されます。つまり、参照は値によって渡されます。(いいえ、これらの用語は適切に理解されているため、これは「参照による呼び出し」または「参照による通過」ではありません。)

于 2013-03-03T07:30:50.123 に答える
1

配列への参照を返し、それをint arr []に割り当てるので、配列にはまだそれを指すものがあります。したがって、ガベージコレクターはまだ参照を持っているため、ガベージコレクターはそれをカリングしません。

これローカル変数でしたが、メインメソッドに返して変数を割り当てたため、配列は保持されます。

于 2013-03-03T07:25:29.430 に答える
1

配列への参照は値によって渡されます。つまり、あなたが持っているのは2つの参照です。値によって、配列への参照が返されます。参照が配列を指している限り、配列を変更(操作を適用)できます。

同じ配列を指す2つの参照がある場合、どちらかの参照を介して配列を変更すると、同じ配列が変更されます。ただし、ある時点で参照の値を変更した場合(つまり、参照が指す配列を変更した場合)、これら2つの参照は異なる配列を指します。

重要な点は、ここでは参照が値によって返されるということです。配列はそのポインタとともに返されません。要するに、あなたは正しいです。私は実際にC++についてほとんど理解していません

テレビにリモコンが2つあるようなものです。ただし、1つのリモコンを他のテレビセットを指すように変更した場合でも、1番目のリモコンは古いテレビにアクセスできます。

于 2013-03-03T07:29:33.733 に答える
-1

Javaでは、オブジェクトは参照によって渡され、値は値によって渡されます。配列はオブジェクトであり、参照によって渡されます。参照渡しを使用すると、ポインタ効果が得られます。

于 2013-03-03T08:21:27.590 に答える