ホームページ > Java > &#&チュートリアル > パラメータの受け渡しとは何ですか?彼の用途は何でしょうか?

パラメータの受け渡しとは何ですか?彼の用途は何でしょうか?

零下一度
リリース: 2017-07-21 22:03:37
オリジナル
4570 人が閲覧しました

1 概要

1. パラメータの受け渡しとは何ですか?

メソッドを呼び出すときにデータを仮パラメータに渡すプロセスは、パラメータの受け渡しと呼ばれます。プログラミング言語には、値による転送と参照による転送という 2 つの転送モードがあります。ここで述べた 2 つの転送メソッドは Java で使用される転送メソッドに限定されるものではなく、Java を含む多くのプログラミング言語で登場する転送メソッドであることを強調しておく必要があります。

2. 変数の型

Javaでは、基本型のデータを指す変数をプリミティブ変数と呼び、オブジェクトを指す変数を参照変数と呼びます。

2 価値の受け渡し

1. 価値の受け渡しとは何ですか?

変数のコピーをメソッドに渡します。メソッド内と外部の操作は分離されます。メソッド内の変数に対する操作は、メソッド外の変数には反映されません。

2. 元の変数

    public void change(int b) {
        b = 7;
    }

    @Testpublic void testBasic() {int a = 9;
        change(a);
        System.out.println(a);
    }
ログイン後にコピー

実際の出力: 9

パラメータが渡されると、値の受け渡しのルールに従って、変数 b はリテラルを指す a のコピーを受け取ります。 value "9":

次に、メソッド内で、b が 7 を指すように、値 7 を b に代入します。 a と b は 2 つの独立変数であるため、参照はありません。それらの間の -reference 関係は、まだ 9 を指します:

3.String

    public void change(String str01) {
        str01 = "baidu";
    }

    @Testpublic void testString() {
        String str = new String("www.baidu.com");
        change(str);
        System.out.println(str);
    }
ログイン後にコピー

実際の出力: www.baidu.com

パラメータが渡されると、str自身のコピーを str01 に渡し、 str01 がヒープに「www.baidu.com」を格納しているオブジェクトも指すようにします。メソッド領域の文字列定数プールの「baidu」を指す場合でも、str はヒープ内の「www.baidu.com」を指します。str と str01 は異なるオブジェクトを指し、相互に影響しません。

ここで注意すべき点が 1 つあります。Java は String を不変オブジェクトになるように設計しています。つまり、String オブジェクトに含まれるリテラル値が変更されると、Java は新しいオブジェクトを作成し、変数がその新しいオブジェクトを指すようにします。

4.StringBuilder

    public void change(StringBuilder builder01) {
        builder01.append(" World!");
    }

    @Testpublic void testStringBuilder() {
        StringBuilder builder = new StringBuilder("Hello");
        change(builder);
        System.out.println(builder);
    }
ログイン後にコピー

実際の出力: Hello World!

パラメータ転送が完了すると、builder01 変数はビルダー変数のコピーを取得し、そのコピーと元の変数ポイントを取得します。ヒープ内の同じオブジェクトに:

メソッド内では、変数 builder は新しいオブジェクトを指しませんが、依然として builder と同じオブジェクトを指します。そのため、ビルダーが同じオブジェクトにアクセスするとき、ヒープ、データ変更:

5. カスタムタイプ

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}
ログイン後にコピー
実際の出力: 1

実行プロセスは StringBuilder の実行プロセスと同じなので、勝ちましたここでは詳細には触れません。上記のコードに次のようにいくつかの変更を加えてみましょう:

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}
ログイン後にコピー
ログイン後にコピー

实际输出:9

参数传递完成时,in01与in指向同一个对象,in01对对象的操作等同于in对对象的操作,接着在方法内部执行"in01=new MyInner();",这样in01就指向了一个新的对象,in01所有的操作都与in无关了:

综合以上的运行结果与分析,可知java参数传递方式符合值传递。

 三 引用传递

1.什么是引用传递?

将变量自身的内存地址传入方法中,方法中的变量指向方法外的变量,在方法中对变量的操作就是对方法外变量的操作

2.自定义类型

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}
ログイン後にコピー
ログイン後にコピー

实际输出:9

如果采用引用传递,传递完成以后,in01指向in,对in01的操作就是对in的操作,in01指向对象2,那么in也指向对象2,输出1,与实际不符,所以不是采用引用传递

不再一一分析其他变量类型,分析后可以发现,java在传递参数时采用的不是引用传递,而是值传递。

简单讲,值传递时方法内外是两个拥有同一指向的变量,引用传递时方法内外是同一个变量。

以上がパラメータの受け渡しとは何ですか?彼の用途は何でしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート