(二):Javaにおける生データ型と参照型のパラメータ伝達

3959 ワード

public class Point{
	private int x;
	private int y;
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
}

public class ParameterTest {
	public void  changeInt(int a){
		a = 3;
	}
	public void changePoint(Point point){
		point.setX(5);
		point.setY(6);
	}
	public void changeString(String str){
		str = "abc";
		System.out.println(str);
	}
	public static void main(String[] args){
		int a = 1;// (1)
		ParameterTest pt = new ParameterTest();// (2)
		pt.changeInt(a);// (3)
		System.out.println(a);// (4)
		
		Point point = new Point(1,2);// (5)
		pt.changePoint(point);// (6)
		System.out.println(point.getX());// (7)
		System.out.println(point.getY());// (8)
		
		String str = "xyz";// (9)
		pt.changeString(str);// (10)
		System.out.println(str);// (11)
		
	}
}

質問1:文(4)を実行した後、印刷の結果は何ですか.どうして?
文(4)の実行が完了すると、印刷の結果は1になります.分析:まず定義int a=1を呼び出す.次にオブジェクトのchangeInt(int a)メソッドを呼び出し、フローはchangeIntメソッドに移行し、aの値をメソッドchangeIntの形式パラメータに割り当て、changeIntメソッドのパラメータaの値を1とし、実行性メソッド体の文a=3、すなわちchangeIntメソッドの裏面パラメータaの値を1から3に変更する.注意:このときメソッドchangeIntメソッドのパラメータaの値の変更はmainメソッドのaの値に影響しません.なぜですか.元のデータ型にとって、それはmainメソッドの中のaの値を伝えるだけで、値を伝えると、両者の間には何の関係もありません.changeIntメソッドの中でパラメータaの変化に対して、外のmainメソッドのaには何の影響もありません.私はただ値をコピーしてあなたにあげただけなので、コピーが終わったら、あなたはあなたの私で、両者の間には何の関係もありません.したがって、文(4)の実行が完了すると、印刷結果は4となる.
まとめ:8つのオリジナルデータ型にとって、それらが伝達されるときに伝達されるのはそれらの値(value)であり、値のコピーであり、コピーした後、あなたはあなたであり、私は私であり、両者の間には何の関係もありません.したがって,メソッド内でコピーされた値の変化は,コピーされたオリジナルデータ型に何の影響も及ぼさない.
質問2:文(7)(8)を実行した後、印刷の結果は何ですか.どうして?
回答:文(7)(8)を実行した後、印刷の結果はそれぞれ5,6です.解析:文(5)Point=new Point(1,2)は、まず横座標が1、縦座標が2のPointオブジェクトを生成します.キーワードnew…があるため、ポイントは、生成されたばかりのこのオブジェクトへの参照、すなわち生成されたばかりのオブジェクトのメモリアドレスを指す、次に文(6)を実行し、changePointメソッドを呼び出し、参照ポイントをchangePoint(Point Point)に付与されたポイントに渡す.注意:参照、すなわちオブジェクトのメモリアドレスが渡され、次にオブジェクトのxを5、yを6に変更すると、オブジェクトの横縦座標が5、6に変更されます.つまり、changePointメソッドでは、pointが指すオブジェクトのxとyの変化が、あなたの外で生成されたこのオブジェクトに反応します.つまり、1が5に変更され、2が6に変更されます.この相手はどうして変わったの?これはjavaの参照タイプへの伝達方式に関し,まず文(5)はメモリのスタック内にPointタイプのオブジェクトが生成されたことを示し,pointという参照はスタック内に生成されたPointタイプのオブジェクトを指し,このオブジェクト内のx座標は1,y座標は2である.次にchangePointメソッドを呼び出します.このメソッドを呼び出すと、pointという参照がchangePointメソッドのpointパラメータに渡されます.Javaでは、javaではオブジェクトがメモリスタックの中にあるアドレスを参照し、オブジェクトのアドレスをchangePointメソッドに渡します.アドレス自体もintタイプの値であり,アドレスをパラメータ形式で伝達する.例えばnew Point(1,2)というオブジェクトのメモリスタック内のアドレスが1234である場合、changePointメソッドが呼び出され、changePoint(Point Point)内のpointに伝達されるアドレスも1234であり、changePointメソッド外の参照はスタック内で生成されるPointクラス型のオブジェクトを指し、changePointメソッド内のパラメータへの参照も同じスタック内で生成されるPointタイプのオブジェクトを指し、JAvaには、それらを参照する2つのアドレスが同じであれば、必然的に同じオブジェクトを指します.したがってchangePointメソッドが呼び出されると、メソッド内の参照とメソッド外の参照は同じオブジェクトを指し、その原因はメモリアドレスの伝達であり、2つの参照のメモリアドレスは同じ必然的に同じオブジェクトを指す.changePointメソッドの文を実行することで,この参照が指すオブジェクトのxを5,yを6に変更する.次にメソッドが終了し、終了した後、changePointメソッドの外側にあるこの参照がオブジェクトを指すx座標とy座標を印刷します.この2つの参照は同じオブジェクトを指すので、結果は5と6です.
質問3:文(11)を実行した後、印刷の結果は何ですか.どうして?
解答:文(11)の実行が完了すると、印刷の結果はxyzになります.解析:文(9)String str="xyz";strを表すこの参照は定数「xyz」(String Pool内)を指し、文(10)のchangeString(String str)メソッドを実行すると、グローバルなstr参照がchangeStringメソッド内のstrに伝達され、グローバルなstr参照とchangeStringメソッド内の参照が同じオブジェクト「xyz」を指すため、パラメータ伝達が完了してもメソッド内の文体が実行されていない場合、これらの参照は、同じオブジェクト「xyz」を指し、メソッドボディ内の文を実行すると、String Pool内に「abc」のオブジェクトが生成され、メソッドボディ内のstrがString Pool内の「abc」オブジェクトを指す.1つの参照は、ある時点で常に1つのオブジェクトのみを指し、changStringメソッドの外側のstrは常に「xyz」オブジェクトを指します.だから出力するときは常に「xyz」です.
まとめ:javaでは、メソッドのパラメータ伝達は、元のデータ型でも参照型でも、一律に伝達されます.
pass by value.原生データ型にとって、伝達された値は与えられた値であり、例えばint a=3は3という値を方法に伝達する.参照タイプとしては、参照自体がアドレスであり、intタイプのメモリアドレス値であるため、この値をメソッドに渡しても値です.