JAvaにおけるパラメータ伝達方式の話題終了例

6261 ワード

JAva初心者が入門して直面している古典的な話題で、本文はこの話題を終わらせることを意味して、javaの中で説があります:Java 、どのようにこの言葉を理解しますか?文字で説明しても分かりにくいだろうし、説明しても分かりにくいだろう.
前提条件
まず、値によるか引用によるかを明確にします.それはc++言語から来ています.引用は中国語辞書の単語ではなく、c++の概念です.「&」という記号を覚えていますか.
どうしてこの話題があるのですか.一つは、引用伝達に対する理解が不十分である.二つ目は、多くのjava書籍や討論論点が急所を突いていないことだ.��
一言で言えば、値によってパラメータを伝達するか、参照によってパラメータを伝達するか、パラメータ伝達方式である以上、形パラメータと実パラメータのみに対して、ここではパラメータ自体を指し、パラメータオブジェクトのサブオブジェクトまたは孫オブジェクトではない.
前提として、c++コードを入力します.
#include 

using namespace std;

class User
{
    private:
        int m_id;
    public:
        User(int id=0){m_id = id;}
        void setId(int id){m_id = id;}
        int getId(){return m_id;}
};

void test0(User t){//    
  User s;
  t = s;
  t.setId(1002);
  cout << "test1:" << t.getId() << endl;
}

void test1(User *t){//    
  t = new User();//          ,      
  t->setId(1002);
  cout << "test1:" << t->getId() << endl;
}

void test2(User* & t){//     
    t = new User();//          ,         
    t->setId(1002);
    cout << "test2:" << t->getId() << endl;
}

int main(int argc, char const *argv[]) {
  cout<< "
pass by ref:"
<new User(); t->setId(1001); cout << t->getId() << endl; test2(t); cout << t->getId() << endl; cout<< "
pass by value:"
<new User(); t->setId(1001); cout << t->getId() << endl; test1(t); cout << t->getId() << endl; return 0; }

出力結果:
pass by ref:
1001
test2:1002
1002

pass by value:
1001
test1:1002
1001

c++ノット:
値で渡すと、関数内でシェイプパラメータが新しいオブジェクトを指し、外側の実パラメータは影響を受けません.
参照で渡すと、関数内でパラメータが新しいオブジェクトを指すように変更され、外側の実パラメータも変わります.
問題を説明するために、コードにメモリが漏れる可能性があります.
上java:
package com.pollyduan.bean;

@Data
public class User {
    private Integer id;

    public static void testObject(User t){
        t=new User();//        ,      
        t.setId(1002);
        System.out.println("testObject="+t);
    }

    @Test
    public void testObject(){
        User user=new User();
        user.setId(1001);
        System.out.println("user="+user);
        testObject(user);
        System.out.println("user="+user);
    }
}

出力結果:
user=User(id=1001)
testObject=User(id=1002)
user=User(id=1001)

JAva小結:
c++の論理と比較して、自分で番号を合わせて席に着いてください.
何事も絶対的ではありません.jdkには引用伝参の例があるかもしれません.例えば、次のようにします.
char[] gg={'a','b','c'};
char[] newGG=new char[gg.length];
System.arraycopy(gg,0,newGG,0,gg.length);

ソースコードを見ると、jdk自体の方法ではなく、JNI、つまりjvmのJNIライブラリパッケージの方法で、わかります.