****
Javaでのパラメーターの受け渡し-値の受け渡しと参照の受け渡し
**
Javaでは、パラメーターの受け渡しは値の受け渡しと参照の受け渡しに分けられます。
Javaのデータタイプは2つのカテゴリに分類されます。1つは参照タイプであり、クラスタイプ(配列、クラス、インターフェイスを含む、文字列を除くすべての複合データタイプ)とも呼ばれ、クラスによって作成されたオブジェクトの変数名を参照します。 、このタイプは、渡すときに「参照渡し」のルールに準拠する必要があります。もう1つは、8つの基本タイプ(バイトタイプ(バイト)、ショート整数(ショート)、整数タイプ(int))のプリミティブタイプです。、長整数(long)、文字(char)、浮動小数点(float)、倍精度(double)、ブール(boolean))、このタイプのデータは、「値転送」ルールに準拠するために呼び出しで渡されますの。
次に、値の受け渡しと参照の受け渡しによってパラメータの受け渡しがどのように実行されるかを紹介します。
1つ、価値の移転
値の転送:メソッドが呼び出されると、実際のパラメーターはその値を対応する正式なパラメーターに渡します。メソッドの実行中に正式なパラメーターを変更しても、実際のパラメーターの値には影響しません。
まず、コードの一部を見ることができます。
package com.yf1020;
public class Student {
public void changeInt(int t) {
t=100;
System.out.println("这里t的值是:" +t);
}
}
ここで最初にStudentクラスを作成します。このクラスには、tの値を変更するメソッドがあります。
次に、オブジェクトを作成し、その中のメソッドを呼び出します。コードは次のとおりです。
package com.yf1020;
public class Manager {
/*
* 程序运行的入口点
* */
public static void main(String[] arg) {
//创建对象
Student st = new Student();
int i = 1000;
//调用方法 在changeInt中改变i的值
st.changeInt(i);
System.out.println("这里i的值是:" +i);
}
出力結果:
結果を出力することにより、メソッドchangeIntで変更されたtがiとは関係がなく、メソッドでのtへの変更が呼び出し元のコードのiの値に影響を与えないことを証明できます。実際、この方法も理解できます。つまり、最初にメインクラスのメインプログラムを確認します。iが1000に設定されると、iの値がメソッドchangeIntに渡され、メソッドchangeIntのtの値が変更されますが、これはメインクラスのiの値には影響しません。メソッドchangeIntでtの値を変更するだけです。
2、参照渡し
参照渡し:パスアドレスとも呼ばれます。メソッドが呼び出されると、実際のパラメーターの参照(パラメーターの値ではなくアドレス)がメソッド内の対応する正式なパラメーターに渡されます。メソッドの実行では、正式なパラメーターに対する操作は、実際には実際のパラメーターに対する操作です。パラメータ値の変更は、実際のパラメータ値に影響します。
参照による受け渡しを理解する前に、まず参照とは何かを理解してください。コードは次のとおりです。
//创建对象,这里的test1类名是随意命名的,没有什么具体意义的
Student st = new Student();
このコードは次のように説明できます。最初にStudentタイプの変数stを宣言し、次にst変数名を新しく作成されたStudentオブジェクトにポイントします。st変数は、新しく作成されたオブジェクトの名前であり、オブジェクトデータ自体ではありません。!!たとえば、あなたは学生オブジェクトであり、「学生A」と呼ばれます。「学生A」という名前を使用する場合、「引用符で囲まれた」はあなたですが、エンティティと「学生A」という名前は同じものではありません。それは「学生A」と呼ばれ、この名前はあなたのオブジェクトを指します。
次のように、すぐに理解できるコード例を見てください。
学生クラス:
package com.yf1020;
public class Student {
private String name;
public void setName(String t) {
name = t;
}
public String getName() {
return name;
}
}
主なカテゴリ:
package com.yf1020;
public class temp {
public static void main(String[] arg) {
//创建对象
Student st1 = new Student();
st1.setName("第一个");
Student st2 = new Student();
st2.setName("第二个");
Student st3 = new Student();
st3.setName("第三个");
//进行交换
st1 = st2; //将st2的引用值赋给st1;
st2 = st3; //将st3的引用赋值给st2;
st3 = st1; //因为上面已经把st2赋给了st1,此时st1内的引用值是之前st2内的值,所以这个时候相当于将最开始st2的值赋给了st3了。
String name1 = st1.getName();
String name2 = st2.getName();
String name3 = st3.getName();
System.out.println(name1);
System.out.println(name2);
System.out.println(name3);
}
}
出力結果:
最終結果から、st3の変数名が最終的にst2のオブジェクト、つまり名前の値が「second」に割り当てられているオブジェクトを指していることがわかります。
同様に、メソッドが呼び出されたときに、メソッドのパラメーターが参照タイプである場合、渡されるのはオブジェクトの名前への参照のみであり、オブジェクト自体ではありません。!!コードは次のように表示されます。
package com.yf1020;
public class Teacher {
public void changeST(Student st) {
String newName = "改名字";
st.setName(newName);
}
public static void main(String[] arg) {
//创建对象
Student st1 = new Student();
//调用前,设定学生的名字
st1.setName("第一个");
Teacher te = new Teacher();
//传入对象引用名:
te.changeST(st1);
String name = st1.getName();
System.out.println("调用后st1的名字其实是:"+name);
}
}
出力結果:
出力値を見ると、teオブジェクトのchangeSTメソッドで元の値が変更されていることがわかります。つまり、呼び出しが行われると、mainメソッドのst1とchangeSTのst変数名がすべて同じStudentを指していることがわかります。オブジェクト!!!