2016-10-03 4 views
0
class insertionSort 
{ 
    public void print(int arr[]) 
    { 
     arr[0]=999999999; 
    } 
} 

public class Sorting 
{ 
    private int[] arr= {0,56,8,75,45,21,68,9,54,2,65,87,52,65,8,5,20,0,2,2}; 

    public static void main(String[] arg) 
    { 
     Sorting sort = new Sorting(); 
     insertionSort inSort = new insertionSort(); 
     inSort.print(sort.arr); 
     System.out.println(sort.arr[0]); 
    } 
} 

Sort.arrはプライベート変数ですが、なぜinSortオブジェクトはarr [0]を操作できますか?javaプライベートメンバー参照で呼び出します

私はパラメータが参照渡しであることを知っています。

関数では、どのように値渡しできますか?

+0

出力:999999999 – enamel

+0

Javaは常に値渡しですが、 'arr'は参照であり、この参照は値渡しです。配列をコピーしないでください。 –

+0

ただし、元のSortオブジェクトのarr []値が変更されます。 – enamel

答えて

2

どのように値渡しすることができますか?

Javaはで常に値渡し、決して参照渡し(this question and its answersを参照してください)。あなたの例で渡される値は、配列を指すオブジェクト参照です。

あなたの問題は、値渡しとは何の関係もありません。これは、オブジェクト参照(値)をメソッドに渡しているという事実と関係しています。これは、参照が参照するオブジェクトへのメソッドへのアクセスを提供します。自然にそれはそのオブジェクトの状態を変更することができます。あなたのケースでは、配列のインデックス0に格納されているものを変更することができます。

これとは別に、オブジェクト参照を取得しているインスタンス変数(フィールド)がprivateであるかどうかは関係ありません。コードinSort.print(sort.arr);Sortingクラスにあるため、sort.arrにアクセスし、その値(オブジェクト参照)を読み取り、その値(オブジェクト参照)をメソッドに渡します。


それは単語「オブジェクト参照」の「参照」と「参照渡し」は程度2つの非常に異なるものを話していることを認識することが重要です。 「オブジェクト参照」では、オブジェクトへの参照(そのポインタ)を指しています。 "pass-by-reference"では、変数への参照(ポインタ)について言及しています。 Javaには参照渡しがありません。

関連する問題