Java_メソッドのパラメータ受け渡し機構の見直し

 記事ディレクトリ

  • 1.価値移転
  • 2.アドレス送信

1. 価値移転

MethodParameter01 クラスを作成し、最初に 2 つの変数 a、b を定義し、それぞれ値 1、2 を割り当てます。クラス A を作成し、クラス A に swap() メソッドを作成します。基礎となるロジック分析を下の図に示します

public class MethodParameter01 {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println("main栈交换前a="+a +" b="+b);
        A a1 = new A();
        a1.swap(a,b);
        System.out.println("main栈交换后a="+a +" b="+b);
    }
}
class A{
    public void swap(int a, int b){
        System.out.println("交换前(swap)a="+a +" b="+b);
        int temp = a;
        a = b;
        b = temp;
        System.out.println("交换后(swap栈)a="+a +" b="+b);
    }
}

操作の結果は次のとおりです。

メインスタックスワップ前 a=1 b=2
スワップ前 (スワップ) a=1 b=2
スワップ後 (スワップスタック) a=2 b=1
メインスタックスワップ後 a=1 b=2

2.住所配送

1.アドレス移行例1

MethodParameter02 クラスを作成し、最初に配列 int arr[] = {1,2,3} を定義します。B クラスを作成し、B クラスに test() メソッドを記述して配列要素を変更します。基礎となるロジック分析を下の図に示します

public class MethodParameter02 {
    public static void main(String[] args) {
        int[] arr ={1,2,3};
        System.out.println("原数组第一个元素="+arr[0]);
        B b = new B();
        b.test(arr);
        System.out.println("调用test()方法后的第一个元素="+arr[0]);
    }
}
class B{
    public void test(int[] arr1){
        arr1[0] = 4;
    }
}

操作の結果は次のとおりです。

元の配列の最初の要素 = 1
test() メソッドを呼び出した後の最初の要素 = 4


2. アドレス移行例2

创建一个MethodParameter03类作为主类,在主类中对名字年龄赋初值。创建一个Person类,在Person类中定义名字年龄两个属性,并写一个test01()方法,其中我编写了对名字年龄的重新赋值。在这个方法中我分了两种情况来判断JVM的内存分配机制:第一种,不对p进行重新new Person()。运行后我们发现,我们调用了test01()方法成功对原来我在主类中已经赋值的两个变量进行修改。原理如下图所示。

public class MethodParameter03 {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "jack";
        person.age = 18;
        System.out.println(person.name+person.age);
        System.out.println("更改后");
        person.test01(person);
        System.out.println(person.name+person.age);
    }
}
class Person{
    String name;
    int age;
    public void test01(Person p){
        p.name = "tom";
        p.age = 10;
    }
}

操作の結果は次のとおりです。

jack18変更
後の
tom10

 2 番目のケースでは、p = new Person() を test01() に追加します。実行後、コンソールの出力が変更されていないことがわかりました。まだ jack18 です。なぜなら、test01() メソッド内にあるため、非常に単純です。 new は新しい Person() オブジェクトであるため、この新しい p オブジェクトを格納するためにヒープに別のスペースが開かれます。

public class MethodParameter03 {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "jack";
        person.age = 18;
        System.out.println(person.name+person.age);
        System.out.println("更改后");
        person.test01(person);
        System.out.println(person.name+person.age);
    }
}
class Person{
    String name;
    int age;
    public void test01(Person p){
        p = new Person();
        p.name = "tom";
        p.age = 10;
    }
}

操作の結果は次のとおりです。

jack18変更
後のjack18

要約する

1. 基本データ型の場合、値が渡され (値のコピー)、仮パラメータの変更は実パラメータに影響しません。基本データ型には以下が含まれます: 整数: byte、int、shot、long 浮動小数点: float、double 論理: boolean 文字: char。

2. 参照型はアドレスを渡し (値も渡しますが、値もアドレスです)、実パラメーターは仮パラメーターの影響を受ける可能性があります。参照データ型には、クラス (class)、インターフェース型 (interface)、配列(list)、列挙型、注釈型、文字列型 (string、StringBuilder などの String の派生クラスなど)、参照データ型が構成されています。 of クラスローダーによって作成され、デフォルトの参照型のデフォルト値が null であるオブジェクトにアクセスするために使用されます。

おすすめ

転載: blog.csdn.net/ming2060/article/details/127728013