Javaでのオリジナルデータ型と参照型のパラメータ転送

3341 ワード

1:
1:パラメータが基本データ型(byte,short,int,long,double,float,double,boolean,charの4種類8種類)の場合、
public class PrimitiveType {
  public void change(int a) {
  a = 3;
  }
  public static void main(String[] args) {
  int a = 1;
  PrimitiveType test = new PrimitiveType();
  test.change(a);
  System.out.println(a); // 1 , 3
  }
  } 

changeメソッドは呼び出されると、メモリにも空間を割り当てる記憶され、渡された値、すなわち3が格納.
メソッドが終了すると、このメモリはゴミ回収を待つが、mainメソッドでは、印刷されたaの値はmainを呼び出す.
メソッド時に割り当てられたメモリ領域は、2つの間には何の関係もないので、印刷されます.
2:パラメータが参照データ型(クラス、配列、インタフェース)の場合、変数の値も伝達されます.
例えば、Point param=new Point()
では、ポイントという変数の値が伝わってきます.ポイントというオブジェクトではありません.
ポイントという変数の値は、実はポイントオブジェクトのメモリ内のアドレス(参照とも呼ばれる)です!
例:
public class ReferenceType {
  public void changePoint(Point point) {
  point.x = 5;
  point.y = 6;
  }
  public void changeReference(Point point) {
  point = null;
  }
  public void testPassByStirng(String param) {
  param = "newValue";
  }
  public static void main(String[] args) {
  int a = 1;
  Point point = new Point(1, 2);
  ReferenceType test = new ReferenceType();
  test.changePoint(point);
  System.out.println(point.x); // 5   1
  System.out.println(point.y); // 6   2
  test.changeReference(point); //  , ?
  int x = point.x; //  
  System.out.println("x   " + x );
  String param = "value";
  test.testPassByStirng(param);
  System.out.println(param); //  value ,  newValue
  }
  }
  class Point {
  int x;
  int y;
  public Point(int x, int y) {
  this.x = x;
  this.y = y;
  }
  } 

Javaでは、アクセスオブジェクトはオブジェクトへの参照によって操作され、1つのオブジェクトは複数の参照によって指向されます.
どのリファレンスがこのオブジェクトの内容を変更しても、リファレンスは複数ありますが、別のリファレンスに影響します.
相手はたった一人!
changePointメソッドが呼び出されると、mainメソッドのPointオブジェクトの参照pointをchangePointのパラメータに渡します.
ポイント、この場合、このポイントリファレンスはmainメソッドのポイントオブジェクト(newから出てくる)を指しますが、あなたはこのメソッドで、
ポイントという参照でポイントオブジェクト(newから出てきた)の内容を修正(point.x=5;point.y=6;)
同じPointオブジェクト(newから出る)を指しているため、メソッドの実行が完了すると、この変更が反映されます.
つのオブジェクトの上で、この时、あなたは更にPointオブジェクトのx,yの値を印刷して、すべて変更された値です!すなわち、1と2ではなく、5と6である.
まとめ:
Javaでは、メソッドパラメータの伝達は常に伝達値であり、この値は、基本データ型に対して、変数に与えられた値であり、
参照データ型の場合、この値はオブジェクト自体ではなくオブジェクトの参照です.
二:javaでは、メソッドの呼び出しによって、オブジェクトの内容を変更するだけで、オブジェクトの参照を変更することはできません.
上記の方法のように
public void changeReference(Point point) {
  point = null;
  }
ポイント=null、この言葉はあなたがchangeReferenceメソッドを呼び出す時、もともとpointという参照はmainメソッドの中であなたと
のpoint参照は同じオブジェクトを指しますが、point=nullを呼び出すと元のpointオブジェクトを指しません.
ただし、この場合、mainメソッドのpoint参照は変更されず、mainのpoint参照は変更されません.
それともmainのポイントオブジェクトを指しますか?だからmainメソッドでpointを呼び出しますx; 空のポインタ異常は発生しません.
つまり、メソッドでは、対応するオブジェクトを参照する内容を変更し、オブジェクトに反映します.
ああ、この时、あなたが相手の内容を取った时、もうあなたが変えたのです!過去の引用をどうしても
変更(point=null)、この参照は永遠に元のオブジェクトを指します!
Stringがパラメータとして渡されるのは、Stringオブジェクト自体が
不変の対象によって決まる!上のtestPassByStirngメソッド.
Stringタイプは、不変のオブジェクトですが、2つに一致します.
パラメータとして渡されると、paramString=「元の値を変更」などの参照操作が行われます.
これは「元の値を変える」ということですが、実はStringクラスの匿名のオブジェクトなので、あなたは
メソッドでは、Stringオブジェクトを再構築し、そのオブジェクトの参照をparamStringに割り当てます.
paramStringという引用を変更しましたが、伝わってきた引用は変更されていません!