English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Javaの値引き渡しと参照引き渡し(面接よくある)

面接のコピーをまず/筆試しの問題:

オブジェクトがメソッドに引数として渡された後、そのメソッドはそのオブジェクトの属性を変更し、変更後の結果を返すことができます。ここでは値引き渡しか参照引き渡しでしょうか?

答え:

これは値引き渡しです。Javaのメソッド呼び出しは引数の値引き渡しのみをサポートしています。オブジェクトインスタンスがメソッドに引数として渡された場合、引数の値はそのオブジェクトの参照です。オブジェクトの属性は呼び出し中に変更できますが、オブジェクト参照の変更は呼び出し元に影響を与えません。++C#では参照や出力引数を渡すことで引数の値を変更することができます。C#では以下のようにのコードを書くことができますが、Javaでは実現できません。

javaでの値引き渡しと参照渡し(参照渡し)、この二つの概念を理解する必要があります。値引きと参照を理解する必要があります。

以下に簡単な例を示して説明します:

例えば、あなたが海外旅行に行き、特別に良い写真を撮影し、友人に共有したい場合は、二つの方法があります。一つはその写真を直接友人に送ることで、友人にその写真のコピーを提供することです。もう一つは、その非常に良い写真をQQ(微博)などにアップロードし、その写真にアクセスするアドレス(URL)を友人に共有することです。
上記の例では、第一种は値引き渡しと考えられ、第二种は参照引き渡し(参照渡し)と考えられます。この概念を理解したら、以下の簡単な分析を行います。

値引き渡し:引数が基本型変数の場合、javaはこのような戦略で渡されます。

上記の写真の共有では、友人が受け取る写真はあなたのコピーであり、そのため友人が写真を編集することであなたの写真には影響を与えず、あなたが写真を編集することでも友人に共有した写真には影響を与えません。

参照渡し:引数が参照型変数の場合、javaはこのような戦略で渡されます。
上記のURLアドレスを友人に渡した場合、友人が編集する権限がある場合、友人が行った操作の結果が反映される写真が自分がアクセスする写真になります。

以下にコードを使用してこの例を説明します:

package com.dufy.reforvalue;
import java.util.Arrays;
/**
 * javaでの値引き渡しと参照渡し
 * 値引き渡し:基本型変数-値引き渡し、値引き渡しは引数のコピーを取得します
 * 参照渡し:参照型変数-参照渡し、参照渡しはオブジェクトの参照先のアドレスを渡します
 * 
 * @author dufy
 * @creation 2017年2月9日
 */
public class ReferenceOrValue {
 /**
  * 基本型、値引き渡し
  * 例えば:友人に写真を共有するとき、相手が受け取るのはあなたの写真の実際のコピーです。
  * あなたと友人はそれぞれの写真に対して操作を行うことができますが、お互いの写真には影響を与えません!
  */
 public static void testVal(int photo){
  photo++;//友人が写真を編集します
  System.out.println("私の友達が写真を見た = " + photo);
 }
 /**
  * 参照型:アドレスによる渡し方
  * 例えば:友人に写真を共有するとき、共有されるのはあなたがネット上にアップロードした写真のURL(アドレス)です。
  * あなたと友人はこのアドレスを通じて写真にアクセスし、写真に対して操作を行うことができます!
  */
 public static void testRef(Photo photo){
  photo.setPhoto("java Photo,Great!");//友達があなたの写真を編集します
  System.out.println("私の友達が写真を見た = " + photo.getPhoto());
 }
 /**
  * 参照型:アドレスによる渡し方
  * 配列は参照型であるため、その参照を渡します。したがって、メソッド内でその値を交換すると、必ず元の値にも影響を与えます。
  */
 public static void testArrayRef(int[] array){
  for (int i = 0; i < array.length; i++) {
   array[i] = 0;
  }
  System.out.println("testArrayRef array is = "+Arrays.toString(array));
 }
 public static void main(String[] args) {
  //一:値による渡し方
  int photo = 10;//送信する写真を定義します
  testVal(photo);//写真をあなたの友達に送信すると、友達が受け取るのはコピーです
  System.out.println("私は写真を見た = " + photo);
  //二:アドレスによる渡し方
  Photo p = new Photo();//写真のオブジェクトを定義します、私自身で撮影したjava photo
  p.setPhoto("java photo");
  testRef(p);//写真オブジェクト(即、URLアドレス)をあなたの友達に送信し、友達が受け取るのはURL(アドレス)であり、URLを開くと写真が表示されます
  System.out.println("私の友達が写真を見た = " + p.getPhoto());
  //三:配列もオブジェクトであり、配列はスタックメモリ内にあります。参照はスタック上にあります。
  int array[] = {1,2,3,4,5};
  testArrayRef(array);
  System.out.println("array is = "+Arrays.toString(array));
 }
 /**
  * 写真クラス
  */
 static class Photo{
  String photo;
  public String getPhoto() {
   return photo;
  }
  public void setPhoto(String photo) {
   this.photo = photo;
  }
 }
}

出力された結果は以下の通りです:

私の友達が写真を見る = 11
私は写真を見る = 10
私の友達が写真を見た = java Photo、素晴らしい!
私の友達が写真を見た = java Photo、素晴らしい!
testArrayRef array is = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]

小さな逸話:以下の問題があります:このmethodはどう書けばいいのでしょうか?

public static void main(String[] args) {
  int a = 10;
  int b = 20;
  method(a,b);//methodが呼び出された後に、a=のみを印刷する必要があります。100,b=200、method(a,b)メソッドを書いてください!
  System.out.println("a = ", + a);
  System.out.println("b = ", + b);
 }

多くの人々が私と同様に、考えもせずに以下のようなコードを書くことがあります:

private static void method(int a, int b) {
  a*=10;
  b*=10;
 }

しかし、実行結果を見てみると、期待した結果が表示されませんでした。

上記の説明をよく読めば、なぜそのような結果が発生するのかを理解するのが難しくありません!

この問題がもたらす可能な正しい結果を示します:

private static void method(int a, int b) {
  System.out.println("a=",100,b=200");
  System.exit(0);
 }

以上は編集者が皆さんに紹介したJavaの値引き渡しとアドレス引き渡し(面接でよく質問される)です。皆さんの助けになることを願っています。何か疑問があれば、コメントを残してください。編集者は皆さんの質問にすぐに回答します。また、呐喊教程サイトへのサポートに感謝しています。

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードしたものであり、このサイトは所有権を持ちません。また、人間による編集は行われていません。著作権侵害が疑われる内容がある場合は、notice#wまでメールを送ってください。3codebox.com(メール送信時は、#を@に変更してください)で通報し、関連する証拠を提供してください。一旦確認がとりあえず、このサイトは即座に侵害される内容を削除します。

おすすめ