Javaプログラミング言語は、最大のパズルの一つであります。javaがされた値によって渡され、参照によって渡されます。私はよくこの質問のインタビューでインタビュアーを尋ねるが、問題の理解が非常に適切ではない多くの面接が残っています。
多くの面接では、このようにそれを理解してあります。
- データの種類に基づいて、透過型の場合は、トランスファプレスの値、
- 送信タイプを基にしている場合、参照を押してください。
これは、正しい理解しますか?彼らも私たちはほとんどの人はアイデアがある「を参照して値、非ベース型パスで通過した基本タイプ」を検証する方法を一緒に見てみましょう、自分のアイデアをテストするためのサンプルコードを書くことができます。
パラメータとして渡された基本データ型
/**
* 基础类型数据作为参数传递
* @Author: danding
* @Date: 2019/11/5
*/
public class TestParams {
public static void main(String[] args){
int x = 6;
System.out.println("x的初始值为:" + x);
add(x);
System.out.println("x的最终值为:" + x);
}
public static void add(int x){
x = x + 1;
System.out.println("add 方法中的x值为:" + x);
}
}
結果:
x的初始值为:6
add 方法中的x值为:7
x的最终值为:6
引数として非ベース型の
まず、私たちはクラスを定義
/**
* 定义一个女朋友的类
* (简陋了点,只有年龄,但不影响我们使用呀)
* @Author: danding
* @Date: 2019/11/5
*/
public class GrilFriend {
private int age;
public GrilFriend(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
その後、我々は、インスタンスを作成し、パラメータとして渡されます
/**
* 基础类型数据作为参数传递
* @Author: danding
* @Date: 2019/11/5
*/
public class TestParams {
public static void main(String[] args){
GrilFriend gril = new GrilFriend(18);
System.out.println("女朋友的初始年龄为:" + gril.getAge());
add(gril);
System.out.println("女朋友的最终年龄为:" + gril.getAge());
}
private static void add(GrilFriend friend){
friend.setAge(friend.getAge()+1);
System.out.println("女朋友在方法中的年龄为:" + friend.getAge());
}
}
結果:
女朋友的初始年龄为:18
女朋友在方法中的年龄为:19
女朋友的最终年龄为:19
引数として非ベース型は、値が実際に変更されたとき。
多くの学生今回は上記の2つの例を確認するために、彼らは彼ら自身の結論に来ていること:
あなたは、基本的なデータ型を渡すとそれ以外の参照渡し、値トランスファープレスの一種です。
この説明では、このような理解は間違っている、間違っている、間違っています。ここでは、最終的にはJavaのパラメータを渡すには値渡しされるか、参照によって渡すことを懸念していますか?
まず、その正しい答え:それは基本的なデータ型やパラメータ参照の種類があるかどうかのJavaパラメータの受け渡しは、ないの参照パスにより、値によって渡されます!
まず、我々は値渡しの意味を理解したり、参照によって渡す必要があります。
- 値によって渡さ:メソッドのパラメータ値が別の変数にコピーされ、その後、コピーするオブジェクトを渡し、それを値渡しと呼ばれています。
- 参照によって渡される:方法に実際のパラメータまたはエイリアスへの参照を渡し、参照によって渡される理由と呼びます。
Dehen悪いあなたの悪い老人、私はこの悪い評価あなたにそれを説明するつもりです、あなたは幽霊であると考えて.....
老婦人(ああ、ない、小さなシリーズ)を聞いてゆっくりと来...
オブジェクトはこの方法であなたは、このオブジェクトのプロパティを変更することができ、メソッドにパラメータとして渡された場合は、ここで終わりでは「値渡し」されるか、「参照渡し」?
A:はい、値渡し。Java言語のみ「の値で。」パラメータを渡します 方法は、パラメータとしてオブジェクトインスタンスに渡されると、パラメータの値は、参照されたオブジェクトのコピーです。同じオブジェクトをポイントし、この方法で変更される可能性コンテンツオブジェクトが呼び出されますが、オブジェクト参照(ない参照コピー)が変更されることはありません。
パラメータ渡しのタイプに基づい
値によって渡されたとして、上記の例では、これは我々が異議を持つべきではない、確認されています。
非基本型の伝送パラメータ
パラメータとして渡されたオブジェクトの次のタイプのために私たちの焦点
例の転送を初めて目:
public class TestParams {
public static void main(String[] args){
Person p1 = new Person();
System.out.println(p1);
change(p1);
System.out.println(p1);
}
private static void change(Person p2){
p2 = new Person();
}
}
class Person{
}
業績
Person@677327b6
Person@677327b6
印刷後に2つのアドレスの値が同じ人物、すなわち完全な呼変更()メソッド、人物変数変更されていないことがわかります。
次のようにこの転写工程を示す略図である:
人物P1 =新しい人()を行う場合には、タイムコード、ヒープメモリに格納されたPersonクラスのオブジェクトのインスタンスを開くためのプログラムメモリ空間を、メモリセルが同時にスタックメモリで開かメモリセル者上図にオブジェクト参照のインスタンス、すなわちポイントを格納するために使用されます。
人は、変数P2の記憶装置の変更()メソッドにその内容を転送する;変化(P1)を行う場合のコードは、人(変更するためのパラメータとして渡される場合)メソッドは、ことに留意すべきです!それ以来、P2のためのストレージユニットのすべての操作の変化()メソッドは、メモリセルとは何の関係が人を指摘していないとp2のポイントです!
今回は、学生は上記のガールフレンドの例であること、年齢のガールフレンドがまだ過程で変更されていない、と言っていますか?あなたはそのコピーを渡す場合は、年齢のガールフレンドが行う変更しないでください?
我々は、図の例では、メモリのガールフレンドにコードを再び歩く場合は、それらの真実を理解する必要があります。
参照コピーいわゆる、それがポイントまたは実際のオブジェクトは、変更または実際のオブジェクトのプロパティ。
私はちょうどことを覚えて、上記の説明は、すべての疑問を解消することを願ってのJavaパラメータ渡し、それが値によって渡される基本的なデータ型やパラメータ参照の種類があるかどうか、参照によって渡されていません!。あなたは、メモリとストレージ容量の異なるオブジェクトとプログラムのより明確な、詳細な説明になり、参照の局所性をヒープを理解し、スタックすると、読みJavaヒープスタックVSを。
「短いステップ、千マイルは、」あなたができる将来の希望は:どこでも夢の馬の生息地を持っています!、ジュニアさあ!
いいえ公共の懸念:「ジャワの親友」、更新毎日のJavaの知識はああ、あなたの到着を楽しみにしていません!
- 「送信グループを 10万人のプログラマーとの進展を」。
- 「送信インタビューを情報BATJのインタビュー、ビデオインタビューレイダースを受け取るために」。
- 「送信楽しいアルゴリズムをビデオチュートリアルの「楽しいアルゴリズム」シリーズを受け取るために」。
- 「送信しない1024」...