値渡しには基本的に値渡しと参照渡しの 2 つの方法があることは誰もが知っていますが、JAVA では値渡しと参照渡しのどちらでしょうか?以下の記事で紹介していますので、ご参考になれば幸いです。
値の受け渡し: は、関数呼び出し時に実際のパラメータのコピーをコピーし、それらを仮パラメータに渡すことを指します。関数内で変更できますが、実際のパラメータ値には影響しません。
参照渡し: 関数呼び出し時に実パラメータのアドレスを仮パラメータに直接渡すことを指し、関数内のパラメータの変更が実パラメータに影響します。価値。
Java で値を渡すにはどうすればよいですか?
Java の値渡しメソッド: 値渡し (すべての変更はメソッド本体にのみ制限され、メソッド本体の外では、いかなる変更操作も無効になります)。 [推奨学習: java コース ]
プログラムを使用して、値のみが Java に渡されることを確認できます
/** * 验证java中只有值传递 */ class User{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }public class TestValue { public static void change(User user2,int a2){ System.out.println("改变之前:"+user2.getName()+",a2="+a2); user2.setName("李四"); //改变 user2 的 name 值 a2 = 10; //改变 a2 的值 System.out.println("改变之后:"+user2.getName()+",a2="+a2); user2 = new User(); //将 user2 重新指向一个新对象 user2.setName("王五"); System.out.println("重新指向一个新对象后:"+user2.getName()); } public static void main(String[] args){ User user1 = new User(); user1.setName("张三"); //初始化 user1 的 name 为张三 int a1 = 5; //初始化 a1 的值为 5 change(user1,a1); //调用方法验证传值方式 System.out.println("调用方法后:"+user1.getName()+",a1="+a1); } }
このプログラムを実行すると、出力結果は次のようになります:
改变之前:张三,a2=5 改变之后:李四,a2=10 重新指向一个新对象后:王五 调用方法后:李四,a1=5
結果分析
## 上の図を分析の補助として使用してみましょうこの段落のプログラムでは、まずUser クラスを定義し、次にテスト クラスで
user1 という名前の
User オブジェクトをインスタンス化し、それに # の値を割り当てます。 # #名前 = '張三'。
この時点で、メモリ内では、
に示すように、オブジェクトのインスタンス化はヒープ内のメモリの一部を開くことと同等であり、メモリ アドレスは # です。 ##017 、この時点で、このオブジェクトの参照は
user1 で、メモリ アドレスは
001 です。オブジェクトのアドレスをメモリに保存します。オブジェクトを指すことを意味します。
次に、メソッド
change()
user1 の
name 値を変更して、Java Way で渡された値を確認します。 。
実パラメータとして
user1
change() メソッドに渡し、仮パラメータ
user2 がこの実パラメータを受け入れます。パラメータを渡す 2 つの方法の違いが明らかになります。値によって渡された場合、定義どおりになります。
図 2
に示すように、
は user1
のコピーです。つまり、パラメーターを渡すときは、 user1
(それ自体がオブジェクトへの参照)、user2
という名前のコピーを作成しました。これもオブジェクトへの参照であり、user1
と user2
は、この時点では同じオブジェクトです。 そして、参照によって渡される場合、
図 5
に示すように、パラメータを渡すときに、
が仮パラメータに直接渡されます。名前を user2
に変更しただけですが、本質的に user1
と user2
は実際には同じです。オブジェクトへの参照です。 次に、出力結果を分析しましょう。値渡しでも参照渡しでも、すべて同じオブジェクトを指しているため、1 行目の出力結果は
张三
でなければなりません。 2 行目の出力では、同じオブジェクトが変更され、値も変更されるため、どのメソッドが使用されているかはまだわかりません。鍵となるのは 3 行目と 4 行目の出力です。
現時点では、user2
を新しいオブジェクトにリダイレクトし、このオブジェクトに値を割り当てます
(参照渡しの場合)。次に、user1
も新しいオブジェクトを指すようにポインターを変更します。最後の行のメソッドを呼び出した後の出力結果は、3 行目の 王五
と同じになりますが、実際、出力は 李思
です。これは、user1
と user2
が実際には同じではないことを示しています。 実際の呼び出しプロセスは
図 2
~
に示されているため、user2
は新しいオブジェクトを指します。# オブジェクト##user1 が指すものは変更されておらず、元のオブジェクトのままです。
基本型パラメータの場合、
a1 の値は最後まで変化しておらず、メソッドの実行時に
a2
a1 の 1 つであることを示します。実行されコピーされます。
User
オブジェクトなどの参照型パラメータの場合、メソッドの呼び出し時に、その参照
user1
user2 のコピーになりますが、これは 2 つの参照 (
a1 と
a2 の関係など) です。
しかし、これは同じオブジェクトを指しており、すべての操作は同じオブジェクトに対するものです。
上記の分析を通じて知ることができます。 Java には値渡しの方法が 1 つしかありません。 ただし、参照型の場合、渡されるパラメータはオブジェクトへの参照です。
以上がJavaで値を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。